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 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,可以扫一扫,任意打赏,您的鼓励是博主的最大动力!
    扫一扫,支付宝打赏 扫一扫,微信打赏
  • 相关阅读:
    LeetCode 230. 二叉搜索树中第K小的元素(Kth Smallest Element in a BST)
    LeetCode 216. 组合总和 III(Combination Sum III)
    LeetCode 179. 最大数(Largest Number)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
    指针变量、普通变量、内存和地址的全面对比
    MiZ702学习笔记8——让MiZ702变身PC的方法
    你可能不知道的,定义,声明,初始化
    原创zynq文章整理(MiZ702教程+例程)
  • 原文地址:https://www.cnblogs.com/LifeDecidesHappiness/p/15769674.html
Copyright © 2011-2022 走看看