WebApi调用封装
public class SimpleApiClient { public static HttpClient CreateHttpClient() { var handler = GetInsecureHandler(); HttpClient httpClient = new HttpClient(handler); //{ // MaxResponseContentBufferSize = 256000 //}; httpClient.DefaultRequestHeaders.Add("Accept", "application/json"); return httpClient; } public static async Task<T> PostAsync<T>(string url, object data) where T : class, new() { try { var client = CreateHttpClient(); string content = JsonConvert.SerializeObject(data); var buffer = Encoding.UTF8.GetBytes(content); var byteContent = new ByteArrayContent(buffer); byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var response = await client.PostAsync(url, byteContent).ConfigureAwait(false); string result = await response.Content.ReadAsStringAsync(); if (response.StatusCode != HttpStatusCode.OK) { throw new Exception($"GetAsync End, url:{url}, HttpStatusCode:{response.StatusCode}, result:{result}"); } if (typeof(T) == typeof(string)) { return (T)(object)result; } return JsonConvert.DeserializeObject<T>(result); } catch (WebException ex) { if (ex.Response != null) { string responseContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); throw new System.Exception($"response :{responseContent}", ex); } throw; } } public static async Task<T> GetAsync<T>(string url, object data) { try { string requestUrl = data == null ? url : $"{url}?{GetQueryString(data)}"; var client = CreateHttpClient(); var response = await client.GetAsync(requestUrl).ConfigureAwait(false); string content = await response.Content.ReadAsStringAsync(); if (response.StatusCode != HttpStatusCode.OK) { throw new Exception($"GetAsync End, url:{url}, HttpStatusCode:{response.StatusCode}, result:{content}"); } if (typeof(T) == typeof(string)) { return (T)(object)content; } var result = JsonConvert.DeserializeObject<T>(content); return result; } catch (WebException ex) { if (ex.Response != null) { string responseContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); throw new Exception($"Response :{responseContent}", ex); } throw; } } private static string GetQueryString(object obj) { var properties = from p in obj.GetType().GetProperties() where p.GetValue(obj, null) != null select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString()); return string.Join("&", properties.ToArray()); } /// <summary> /// 如果是本地服务,不使用https /// </summary> /// <returns></returns> private static HttpClientHandler GetInsecureHandler() { var handler = new HttpClientHandler(); handler.UseDefaultCredentials = true; //handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => //{ // if (cert.Issuer.Equals("CN=localhost")) // return true; // return errors == System.Net.Security.SslPolicyErrors.None; //}; return handler; } }
改版后:
public class SimpleApiClient { public static HttpClient CreateHttpClient(Dictionary<string, string> headers = null) { var handler = GetInsecureHandler(); HttpClient httpClient = new HttpClient(handler); //{ // MaxResponseContentBufferSize = 256000 //}; httpClient.DefaultRequestHeaders.Add("Accept", "application/json"); httpClient.Timeout = new TimeSpan(0, 0, 10, 0); if (headers != null) { foreach (var item in headers) { httpClient.DefaultRequestHeaders.Add(item.Key, item.Value); } } return httpClient; } public static async Task PostAsync<T>( string url, object data, Dictionary<string, string> headers = null, Action<HttpResponseMessage> callBackAction = null) //where T : class, new() { try { var client = CreateHttpClient(headers); string content = JsonConvert.SerializeObject(data); var buffer = Encoding.UTF8.GetBytes(content); var byteContent = new ByteArrayContent(buffer); byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var response = await client.PostAsync(url, byteContent).ConfigureAwait(false); callBackAction?.Invoke(response); } catch (WebException ex) { if (ex.Response != null) { string responseContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); throw new Exception($"response :{responseContent}", ex); } throw; } } public static async Task PutAsync<T>( string url, object data, Dictionary<string, string> headers = null, Action<HttpResponseMessage> callBackAction = null) //where T : class, new() { try { var client = CreateHttpClient(headers); string content = JsonConvert.SerializeObject(data); var buffer = Encoding.UTF8.GetBytes(content); var byteContent = new ByteArrayContent(buffer); byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var response = await client.PutAsync(url, byteContent).ConfigureAwait(false); callBackAction?.Invoke(response); } catch (WebException ex) { if (ex.Response != null) { string responseContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); throw new Exception($"response :{responseContent}", ex); } throw; } } public static async Task GetAsync<T>( string url, object data, Dictionary<string, string> headers = null, Action<HttpResponseMessage> callBackAction = null) { try { string requestUrl = data == null ? url : $"{url}?{GetQueryString(data)}"; var client = CreateHttpClient(headers); var response = await client.GetAsync(requestUrl).ConfigureAwait(false); callBackAction?.Invoke(response); } catch (WebException ex) { if (ex.Response != null) { string responseContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); throw new Exception($"Response :{responseContent}", ex); } throw; } } /// <summary> /// 反序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="httpResponseMessage"></param> /// <returns></returns> public static async Task<T> DeserializeObject<T>(HttpResponseMessage httpResponseMessage) { string content = await httpResponseMessage.Content.ReadAsStringAsync(); //如果是值類型,直接強制轉換 var type = typeof(T); if (type.IsValueType) { return (T)Convert.ChangeType(content, type); } if (typeof(T) == typeof(string)) { return (T)(object)content; } var result = JsonConvert.DeserializeObject<T>(content); return result; } private static string GetQueryString(object obj) { var properties = from p in obj.GetType().GetProperties() where p.GetValue(obj, null) != null select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString()); return string.Join("&", properties.ToArray()); } /// <summary> /// 如果是本地服务,不使用https /// </summary> /// <returns></returns> private static HttpClientHandler GetInsecureHandler() { var handler = new HttpClientHandler(); handler.UseDefaultCredentials = true; //handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => //{ // if (cert.Issuer.Equals("CN=localhost")) // return true; // return errors == System.Net.Security.SslPolicyErrors.None; //}; return handler; } #region Test private static readonly string DefaultUserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"; private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //总是接受 } public static HttpWebResponse PostHttps(string url, IDictionary<string, string> parameters, Encoding charset) { HttpWebRequest request = null; CookieContainer cookie = new CookieContainer(); //HTTPSQ请求 ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult; request = WebRequest.Create(url) as HttpWebRequest; request.Proxy = new WebProxy(new Uri("http://localhost:8888")); // port:8888就是Fiddler默认监听的端口 request.CookieContainer = cookie; request.ProtocolVersion = HttpVersion.Version11; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.UserAgent = DefaultUserAgent; request.KeepAlive = true; request.Headers["Accept-Language"] = "zh-CN,zh;q=0.9"; //request.Headers["Cookie"] = "username=aaaaaa; Language=zh_CN"; //如果需要POST数据 if (!(parameters == null || parameters.Count == 0)) { StringBuilder buffer = new StringBuilder(); int i = 0; foreach (string key in parameters.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, WebUtility.UrlEncode(parameters[key])); } else { buffer.AppendFormat("{0}={1}", key, WebUtility.UrlEncode(parameters[key])); } i++; } byte[] data = charset.GetBytes(buffer.ToString()); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } } return (HttpWebResponse)request.GetResponse(); } public static void ApproveStart() { string url = "https://xxxx/v1/devices/02630000026238/xxxxx"; Encoding encoding = Encoding.GetEncoding("utf-8"); IDictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("xxx", "xxx"); parameters.Add("xxx", "xxx"); parameters.Add("xxx", "xxx"); HttpWebResponse response = PostHttps(url, parameters, encoding); //打印返回值 Stream stream = response.GetResponseStream(); //获取响应的字符串流 StreamReader sr = new StreamReader(stream); //创建一个stream读取流 string html = sr.ReadToEnd(); //从头读到尾,放到字符串html Console.WriteLine(html); } #endregion } public async void ShowResult(HttpResponseMessage response) { if (InvokeRequired) { BeginInvoke(new Action<HttpResponseMessage>(ShowResult), response); return; } TbxResult.Text = response.StatusCode.ToString(); TbxResult.AppendText("\r\n"); string result = await response.Content.ReadAsStringAsync(); switch ((int)response.StatusCode) { case 200: var obj = SimpleApiClient.DeserializeObject<object>(response).Result; TbxResult.AppendText(obj?.ToString() ?? ""); break; default: TbxResult.AppendText($@"HttpStatusCode: {response.StatusCode}, result: {result}"); break; } } var url = $@"{ConfigurationManager.AppSettings["ApiDomain"]}devices/{TbxSerialNumber.Text}/xxxx"; await SimpleApiClient.PostAsync<object>(url, dto,null, _frmMain.ShowResult);
浙公网安备 33010602011771号