Winform中使用HttpClient与后端api服务进行交互
前端js可以使用ajax、axios发出http请求 在c#中winform、控制台等可以通过WebRequest、WebClient、HttpClient
有关三个类的性能对比大家可以自己测试一下,这里我主要使用和封装了HttpClient类,对于ResultDto大家可以根据所需进行修改或删除 ###WebRequest 命名空间: System.Net,这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。另一个好处是HttpWebRequest类不会阻塞UI线程。例如,当您从响应很慢的API服务器下载大文件时,您的应用程序的UI不会停止响应。HttpWebRequest通常和WebResponse一起使用,一个发送请求,一个获取数据。HttpWebRquest更为底层一些,能够对整个访问过程有个直观的认识,但同时也更加复杂一些。 简单的使用方法
public static Image RequestGetImage(string requestUrl) { return Image.FromStream(WebRequest.Create(requestUrl).GetResponse().GetResponseStream()); }
###WebClient 命名空间System.Net,WebClient是一种更高级别的抽象,是HttpWebRequest为了简化最常见任务而创建的,使用过程中你会发现他缺少基本的header,timeoust的设置,不过这些可以通过继承httpwebrequest来实现。相对来说,WebClient比WebRequest更加简单,它相当于封装了request和response方法,不过需要说明的是,Webclient和WebRequest继承的是不同类,两者在继承上没有任何关系。使用WebClient可能比HttpWebRequest直接使用更慢(大约几毫秒),但却更为简单,减少了很多细节,代码量也比较少。 WebClient我暂时没有使用过 ###HttpClient HttpClient是.NET4.5引入的一个HTTP客户端库,其命名空间为 System.Net.Http ,.NET 4.5之前我们可能使用WebClient和HttpWebRequest来达到相同目的。HttpClient利用了最新的面向任务模式,使得处理异步请求非常容易。它适合用于多次请求操作,一般设置好默认头部后,可以进行重复多次的请求,基本上用一个实例可以提交任何的HTTP请求。HttpClient有预热机制,第一次进行访问时比较慢,所以不应该用到HttpClient就new一个出来,应该使用单例或其他方式获取HttpClient的实例
public class HttpHelper { private static readonly object LockObj = new object(); private static HttpClient client = null; private static readonly string BASE_ADDRESS = "http://localhost:1229/"; public HttpHelper() { GetInstance(); } /// <summary> /// 制造单例 /// </summary> /// <returns></returns> public static HttpClient GetInstance() { if (client == null) { lock (LockObj) { if (client == null) { client = new HttpClient() { BaseAddress = new Uri(BASE_ADDRESS) }; } } } return client; } /// <summary> /// 异步Post请求 /// </summary> /// <param name="url">请求地址</param> /// <param name="strJson">传入的数据</param> /// <returns></returns> public async Task<string> PostAsync(string url,string strJson) { try { HttpContent content = new StringContent(strJson); content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); HttpResponseMessage res = await client.PostAsync(url,content); if (res.StatusCode == System.Net.HttpStatusCode.OK) { string resMsgStr = await res.Content.ReadAsStringAsync(); return resMsgStr; } else { return null; } } catch (Exception) { return null; } } /// <summary> /// 同步Post /// </summary> /// <param name="url"></param> /// <param name="strJson"></param> /// <returns></returns> public string Post(string url, string strJson) { try { HttpContent content = new StringContent(strJson); content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); //client.DefaultRequestHeaders.Connection.Add("keep-alive"); //由HttpClient发出Post请求 Task<HttpResponseMessage> res = client.PostAsync(url, content); if (res.Result.StatusCode == System.Net.HttpStatusCode.OK) { string resMsgStr = res.Result.Content.ReadAsStringAsync().Result; return resMsgStr; } else { return null; } } catch (Exception ex) { return null; } } /// <summary> /// 异步Post请求 /// </summary> /// <typeparam name="TResult">返回参数的数据类型</typeparam> /// <param name="url">请求地址</param> /// <param name="data">传入的数据</param> /// <returns></returns> public async Task<TResult> PostAsync<TResult>(string url, object data) { try { var jsonData = JsonConvert.SerializeObject(data); HttpContent content = new StringContent(jsonData); content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); HttpResponseMessage res = await client.PostAsync(url, content); if (res.StatusCode == System.Net.HttpStatusCode.OK) { string resMsgStr = await res.Content.ReadAsStringAsync(); var result= JsonConvert.DeserializeObject<ResultDto<TResult>>(resMsgStr); return result != null ? result.Data : default; } else { MessageBox.Show(res.StatusCode.ToString()); return default; } } catch (Exception ex) { MessageBox.Show(ex.Message); return default; } } /// <summary> /// 同步Get请求 /// </summary> /// <param name="url">请求地址</param> /// <returns></returns> public string Get(string url) { try { var responseString = client.GetStringAsync(url); return responseString.Result; } catch (Exception ex) { return null; } } /// <summary> /// 异步Get请求 /// </summary> /// <param name="url">请求地址</param> /// <returns></returns> public async Task<string> GetAsync(string url) { try { var responseString =await client.GetStringAsync(url); return responseString; } catch (Exception ex) { return null; } } /// <summary> /// 异步Get请求 /// </summary> /// <typeparam name="TResult">返回参数的数据</typeparam> /// <param name="url">请求地址</param> /// <returns></returns> public async Task<TResult> GetAsync<TResult>(string url) { try { var resMsgStr = await client.GetStringAsync(url); var result = JsonConvert.DeserializeObject<ResultDto<TResult>>(resMsgStr); return result != null ? result.Data : default; } catch (Exception ex) { return default(TResult); } } } public class ResultDto<TResult> { public string Msg { get; set; } public TResult Data { get; set; } public bool Success { get; set; } } }
记录我在博客园发布的第一篇文章,后续会把本人在csdn的文章都迁移过来 https://blog.csdn.net/hyx1229
- 使用 OpenSSL API 进行安全编程,第 3 部分: 提供安全服务
- jQuery Ajax前后端使用JSON进行交互
- 语义Web服务的API使用实例:OWL-S API结合matchmaker、推理机(Jena、Pellet)进行语义转换、匹配、组合及调用web服务
- C# WinForm 和 javascript进行交互 使用HTML做界面
- WCF服务使用(IIS+Http)和(Winform宿主+Tcp)两种方式进行发布
- 使用 OpenSSL API 进行安全编程,第 3 部分: 提供安全--服务
- 使用iServer JAVA API访问iServer空间分析服务进行叠加分析示例
- 实践指南:使用SpringBoot构建API后端服务 上
- CXF之使用jaxws API 发布服务与进行客户端调用
- JSON(四)——异步请求中前后端使用Json格式的数据进行交互
- 使用 OpenSSL API 进行安全编程,第 3 部分: 提供安全服务
- 使用axios跟后端进行交互时遇到的一个问题
- Flask使用ajax进行前后端交互
- 如何使用angularJS与后端进行交互
- 使用 OpenSSL API 进行安全编程,第 3 部分: 提供安全服务
- 使用 OpenSSL API 进行安全编程,第 3 部分: 提供安全服务 OpenSSL 提供必要的能力
- 在非英文字符集的页面上,如果使用Ajax方式进行数据交互的话,就必须要注意保证前后端数据的统一编码,否则,很容易就出现乱码!
- 使用 OpenSSL API 进行安全编程,第 3 部分: 提供安全服务
- 使用AngularJS的$http服务与服务端进行数据交互
- jQuery Ajax前后端使用JSON进行交互示例