远程接口调用
项目中遇到这样一个问题,一个服务器上的网站要调用到另一个服务器上的接口来进行创建订单、显示订单等一系列的操作。那么,怎么去调用到远程的接口呢?
首先将远程接口的地址添加到web.config里,方便在程序里的各个地方调用。(这里假设地址为“http://localhost:7446/”)
<add key="ServiceHost" value="http://localhost:7446/"/>
然后来看我们的代码。在类内先获取到ServiceHost的值
private readonly string hostName = System.Configuration.ConfigurationManager.AppSettings["ServiceHost"];
Get请求
public bool CancelOrder(string orderId) { //拼接请求地址 string postUrl = string.Format(hostName + "order/CancelOrder" + "?orderId={0}", orderId); //调用Get请求方法 var result = GetMessage(postUrl); //实例化 Json 转换 对象 JavaScriptSerializer serializer = new JavaScriptSerializer(); //调用Deserialize方法 将GetMessage方法传回的Json数据 转换成记录是否取消成功的IDictionary<string, bool>对象 var data = serializer.Deserialize<IDictionary<string, bool>>(result); //返回取消 结果 true or false return data["Result"]; } private string GetMessage(string requestUrl) { //根据参数requestUrl 创建 Web请求对象HttpWebRequest HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(requestUrl); httpWebRequest.Method = "GET"; httpWebRequest.ContentType = "application/xml; charset=UTF-8"; httpWebRequest.Accept = "application/xml; charset=UTF-8"; httpWebRequest.KeepAlive = false; string result = string.Empty; //读取 回复数据到 result using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse()) { using (Stream responseStream = httpWebResponse.GetResponseStream()) { using (StreamReader streamReader = new StreamReader(responseStream)) { result = streamReader.ReadToEnd(); } } } return result; }
POST请求
public bool CreateOrder(OrderRequest request, string memberid) { string postUrl = string.Format(hostName + "order/CreateOrder?memberid={0}", memberid); var result = PostMessage(Serialize(request), postUrl); JavaScriptSerializer serializer = new JavaScriptSerializer(); var data = serializer.Deserialize<IDictionary<string, bool>>(result); return data["Result"]; } /// <summary> /// 序列化object对象为XML字符序列 /// </summary> public static byte[] Serialize(object ObjectToSerialize) { byte[] result = null; XmlSerializer xmlSerializer = new XmlSerializer(ObjectToSerialize.GetType()); using (MemoryStream memoryStream = new MemoryStream()) { XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, new UTF8Encoding(false)); xmlTextWriter.Formatting = System.Xml.Formatting.Indented; xmlSerializer.Serialize(xmlTextWriter, ObjectToSerialize); xmlTextWriter.Flush(); xmlTextWriter.Close(); result = memoryStream.ToArray(); } return result; } private string PostMessage(byte[] xml, string postUrl) { HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(postUrl); //POST 请求 httpWebRequest.Method = "POST"; //内容长度 xml的长度 httpWebRequest.ContentLength = (long)xml.Length; httpWebRequest.ContentType = "application/xml; charset=UTF-8"; httpWebRequest.Accept = "application/xml; charset=UTF-8"; httpWebRequest.KeepAlive = false; //将xml读取到requestStream里 using (Stream requestStream = httpWebRequest.GetRequestStream()) { requestStream.Write(xml, 0, xml.Length); } string result = string.Empty; using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse()) { using (Stream responseStream = httpWebResponse.GetResponseStream()) { using (StreamReader streamReader = new StreamReader(responseStream)) { result = streamReader.ReadToEnd(); } } } return result; }