zoukankan      html  css  js  c++  java
  • 【转载】WinForm中使用HttpClient与后端API服务进行交互

    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

    本文作者:Love In Winter
    本文链接:https://www.cnblogs.com/LifeDecidesHappiness/p/15769674.html
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,可以扫一扫,任意打赏,您的鼓励是博主的最大动力!
    扫一扫,支付宝打赏 扫一扫,微信打赏
  • 相关阅读:
    爱链笔记-openid获取
    爱链笔记-后端设置环境变量
    爱链笔记-以太坊连接
    爱链笔记-linux操作
    爱链笔记-git
    爱链笔记-后台文件上传
    Dynamics CRM 安全模型的性能问题
    Dynamics 365 登录后网页显示空白
    记D365开发的最佳实践
    Dynamics 365 incident原生实体特点
  • 原文地址:https://www.cnblogs.com/LifeDecidesHappiness/p/15769674.html
Copyright © 2011-2022 走看看