using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Xml; using wms.dto.response; using wms.util.Ext; namespace wms.util.Http { public class HttpUtil { public static string ERPWebServerPath = string.Empty; #region Get请求 /// /// Get请求 /// /// 接口地址 /// 超时时间 /// 编码方式 /// 内容格式 public static string GetRequest(string remoteUrl, int timeOut = 30000, string encode = "UTF-8", string contentType = "application/json") { var result = ""; try { var mRequest = (HttpWebRequest)WebRequest.Create(remoteUrl); mRequest.Timeout = timeOut; mRequest.ContentType = contentType; var mResponse = (HttpWebResponse)mRequest.GetResponse(); Stream responseStream = mResponse.GetResponseStream(); if (responseStream == null) { return string.Empty; } using (System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding(encode))) { result = reader.ReadToEnd(); } responseStream.Close(); } catch (Exception ex) { throw ex; } return result; } #endregion Get请求 #region POST请求 /// /// 发起HTTP请求 /// /// 接口地址 /// 请求参数 /// 超时时间 /// 编码方式 /// 内容格式 public static string PostRequest(string remoteUrl, string postData, int timeOut = 30000, string encode = "UTF-8", string contentType = "application/json", string requestid = "", string sourcecode = "", string servicecode = "") { var result = string.Empty; try { var mRequest = (HttpWebRequest)WebRequest.Create(remoteUrl); //相应请求的参数 byte[] data = Encoding.GetEncoding(encode).GetBytes(postData); mRequest.Method = "Post"; mRequest.ContentType = contentType; mRequest.ContentLength = data.Length; mRequest.Timeout = timeOut; if (!string.IsNullOrEmpty(requestid)) { mRequest.Headers["requestId"] = requestid; mRequest.Headers["sourceCode"] = sourcecode; mRequest.Headers["serviceCode"] = servicecode; } //请求流 Stream requestStream = mRequest.GetRequestStream(); requestStream.Write(data, 0, data.Length); requestStream.Close(); //响应流 var mResponse = (HttpWebResponse)mRequest.GetResponse(); var responseStream = mResponse.GetResponseStream(); Encoding code = Encoding.GetEncoding(encode); if (responseStream != null) { var readStream = new StreamReader(responseStream, code); var read = new Char[256]; int count = readStream.Read(read, 0, 256); while (count > 0) { var str = new String(read, 0, count); result = result + str; count = readStream.Read(read, 0, 256); } responseStream.Close(); } if (!string.IsNullOrEmpty(requestid) && mResponse.Headers["esbCode "] != "000000" && string.IsNullOrEmpty(result)) { return new SRes() { ResCode = 500, ResMsg = "esbDesc:" + mResponse.Headers["esbDesc"], Memo1 = "esbCode:" + mResponse.Headers["esbCode"] }.ToCamelCaseString(); } } catch (Exception ex) { throw ex; } return result; } private static readonly HttpClient _httpClient = new HttpClient(); /// /// 发起HTTP请求 /// /// 接口地址 /// 请求参数 /// 编码方式 /// 内容格式 /// 请求ID /// 来源代码 /// 服务代码 public static async Task PostRequestAsync(string remoteUrl, string postData, string encode = "UTF-8", string contentType = "application/json", string requestid = "", string sourcecode = "", string servicecode = "") { try { var content = new StringContent(postData, Encoding.GetEncoding(encode), contentType); // 设置请求头 if (!string.IsNullOrEmpty(requestid)) { content.Headers.Add("requestId", requestid); content.Headers.Add("sourceCode", sourcecode); content.Headers.Add("serviceCode", servicecode); } // 发送异步POST请求 using (var response = await _httpClient.PostAsync(remoteUrl, content)) { response.EnsureSuccessStatusCode(); // 读取响应内容 var result = await response.Content.ReadAsStringAsync(); if (!string.IsNullOrEmpty(requestid) && response.Headers.TryGetValues("esbCode", out var esbCodes) && !esbCodes.Contains("000000") && string.IsNullOrEmpty(result)) { return new SRes() { ResCode = 500, ResMsg = "esbDesc:" + response.Headers.GetValues("esbDesc").FirstOrDefault(), Memo1 = "esbCode:" + esbCodes.FirstOrDefault() }.ToCamelCaseString(); } return result; } } catch (Exception ex) { throw ex; } } /// /// 不等待的异步HTTP请求 /// /// 接口地址 /// 请求参数 /// 编码方式 /// 内容格式 /// 请求ID /// 来源代码 /// 服务代码 public static void FireAndForgetPostRequest(string remoteUrl, string postData, string encode = "UTF-8", string contentType = "application/json", string requestid = "", string sourcecode = "", string servicecode = "") { _ = PostRequestAsync(remoteUrl, postData, encode, contentType, requestid, sourcecode, servicecode); } /// /// 通过POST提交方式获取XML数据 /// /// 请求XML内容 /// 请求URL /// public static XmlDocument PostRequestXml(string remoteUrl, string postData) { if (string.IsNullOrEmpty(postData) || string.IsNullOrEmpty(remoteUrl)) { return null; } string result = PostRequest(remoteUrl, postData, 30000, "UTF-8", "application/x-www-form-urlencoded"); if (string.IsNullOrEmpty(result)) { var xml = new XmlDocument(); xml.LoadXml(result); return xml; } return null; } /// /// 发起HTTP请求 /// /// 接口地址 /// 请求参数 /// 超时时间 /// 编码方式 /// 内容格式 public static string PostRequestByWebApi(string remoteUrl, string postData, int timeOut = 30000, string encode = "UTF-8", string contentType = "application/json")//application/x-www-form-urlencoded application/json { var result = string.Empty; try { if (string.IsNullOrEmpty(remoteUrl)) remoteUrl = ERPWebServerPath; var mRequest = (HttpWebRequest)WebRequest.Create(remoteUrl); //相应请求的参数 byte[] data = Encoding.GetEncoding(encode).GetBytes(postData); mRequest.MaximumAutomaticRedirections = data.Length; mRequest.MaximumResponseHeadersLength = data.Length; mRequest.Method = "Post"; mRequest.ContentType = contentType; mRequest.ContentLength = data.Length; mRequest.Timeout = timeOut; //请求流 Stream requestStream = mRequest.GetRequestStream(); requestStream.Write(data, 0, data.Length); requestStream.Close(); //响应流 var mResponse = (HttpWebResponse)mRequest.GetResponse(); var responseStream = mResponse.GetResponseStream(); Encoding code = Encoding.GetEncoding(encode); if (responseStream != null) { var readStream = new StreamReader(responseStream, code); var read = new Char[256]; int count = readStream.Read(read, 0, 256); while (count > 0) { var str = new String(read, 0, count); result = result + str; count = readStream.Read(read, 0, 256); } responseStream.Close(); } } catch (Exception ex) { throw ex; } return result; } #endregion POST请求 } }