HttpClient 扩展方法

http在 .net core 2.0后续版本里更多的是使用IHttpClientFactory,那么这里写一下HttpClient 扩展方法,方便从IHttpClientFactory中通过CreateClient()方法获取的httpClient对象直接使用

在web类型项目中可以直接通过services.AddHttpClient() DI注入

在非web类项目可以通过通用主机 services.AddHttpClient()  DI注入

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace Utils.Http.Extension
{
    public static class HttpClientExtension
    {
        /// <summary>
        ///  formData
        /// </summary>
        /// <param name="httpClient"></param>
        /// <param name="url"></param>
        /// <param name="formData"></param>
        /// <param name="headerData"></param>
        /// <param name="charset"></param>
        /// <param name="mediaType"></param>
        /// <returns></returns>
        public static async Task<HttpResponseMessage> HttpPostByFormDataAsync(this HttpClient httpClient,string url, List<KeyValuePair<string, string>> formData = null, List<KeyValuePair<string, string>> headerData = null, string charset = "UTF-8", string mediaType = "application/x-www-form-urlencoded")
        {

            string tokenUri = url;

            if (formData == null)
            {
                formData = new List<KeyValuePair<string, string>>();
            }

            HttpContent content = new FormUrlEncodedContent(formData);
            content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
            content.Headers.ContentType.CharSet = charset;

            if (headerData != null)
            {
                for (int i = 0; i < headerData.Count; i++)
                {
                    content.Headers.Add(headerData[i].Key, headerData[i].Value);
                }
            }


            HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, tokenUri);
            requestMessage.Content = content;

            try
            {
                if (headerData != null)
                {
                    for (int i = 0; i < headerData.Count; i++)
                    {
                        if (requestMessage.Headers.Contains(headerData[i].Key))
                        {
                            requestMessage.Headers.Remove(headerData[i].Key);

                        }
                        requestMessage.Headers.Add(headerData[i].Key, headerData[i].Value);
                    }
                }
            }
            catch (Exception ex)
            {

            }

            HttpResponseMessage resp = await httpClient.SendAsync(requestMessage);
            resp.EnsureSuccessStatusCode();

            var info = resp.Content.ReadAsStringAsync().Result;

            return resp;
        }

        /// <summary>
        /// 异步请求post(体,模型)
        /// </summary>
        /// <param name="uri">网络基址</param>
        /// <param name="url">网络的地址("/api/UMeng")</param>
        /// <param name="bodyData">体数据</param>
        /// <param name="charset">编码格式</param>
        /// <param name="mediaType">头媒体类型</param>
        /// <param name="headerData"></param>
        /// <returns></returns>
        public static async Task<HttpResponseMessage> HttpPostByBodyDataAsync(this HttpClient httpClient, string uri, string url, object bodyData, List<KeyValuePair<string, string>> urlAttach = null, List<KeyValuePair<string, string>> headerData = null, string charset = "UTF-8", string mediaType = "application/json")
        {

            StringBuilder tokenUriBuilder = new StringBuilder();
            tokenUriBuilder.Append(uri);
            tokenUriBuilder.Append(url);


            if (urlAttach != null && urlAttach.Count > 0)
            {
                tokenUriBuilder.Append("?");

                for (int i = 0; i < urlAttach.Count; i++)
                {
                    tokenUriBuilder.Append($"{urlAttach[i].Key}={urlAttach[i].Value}");
                    if (i < urlAttach.Count - 1)
                    {
                        tokenUriBuilder.Append("&");
                    }
                }

            }

            string tokenUri = tokenUriBuilder.ToString();
            
            var json = JsonConvert.SerializeObject(bodyData);

            var infoTemp = ObjUrlEncode(bodyData);

            HttpContent content = new StringContent(json);
            content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
            content.Headers.ContentType.CharSet = charset;

            HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, tokenUri);
            requestMessage.Content = content;

            try
            {
                if (headerData != null)
                {
                    for (int i = 0; i < headerData.Count; i++)
                    {
                        if (requestMessage.Headers.Contains(headerData[i].Key))
                        {
                            requestMessage.Headers.Remove(headerData[i].Key);

                        }
                        requestMessage.Headers.Add(headerData[i].Key, headerData[i].Value);
                    }
                }
            }
            catch (Exception ex)
            {

            }

            HttpResponseMessage resp = await httpClient.SendAsync(requestMessage);
            resp.EnsureSuccessStatusCode();

            var info = resp.Content.ReadAsStringAsync().Result;

            return resp;
        }


        /// <summary>
        /// 异步请求post(体,模型)
        /// </summary>
        /// <param name="uri">网络基址</param>
        /// <param name="url">网络的地址("/api/UMeng")</param>
        /// <param name="bodyData">体数据</param>
        /// <param name="charset">编码格式</param>
        /// <param name="mediaType">头媒体类型</param>
        /// <param name="headerData"></param>
        /// <returns></returns>
        public static async Task<HttpResponseMessage> HttpPostByBodyDataAsync(this HttpClient httpClient, string url, object bodyData, List<KeyValuePair<string, string>> urlAttach = null, List<KeyValuePair<string, string>> headerData = null, string charset = "UTF-8", string mediaType = "application/json")
        {

            StringBuilder tokenUriBuilder = new StringBuilder();

            tokenUriBuilder.Append(url);


            if (urlAttach != null && urlAttach.Count > 0)
            {
                tokenUriBuilder.Append("?");

                for (int i = 0; i < urlAttach.Count; i++)
                {
                    tokenUriBuilder.Append($"{urlAttach[i].Key}={urlAttach[i].Value}");
                    if (i < urlAttach.Count - 1)
                    {
                        tokenUriBuilder.Append("&");
                    }
                }

            }

            string tokenUri = tokenUriBuilder.ToString();
            

            var json = JsonConvert.SerializeObject(bodyData);

            var infoTemp = ObjUrlEncode(bodyData);

            HttpContent content = new StringContent(json);
            content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
            content.Headers.ContentType.CharSet = charset;

            HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, tokenUri);
            requestMessage.Content = content;

            try
            {
                if (headerData != null)
                {
                    for (int i = 0; i < headerData.Count; i++)
                    {
                        if (requestMessage.Headers.Contains(headerData[i].Key))
                        {
                            requestMessage.Headers.Remove(headerData[i].Key);

                        }
                        requestMessage.Headers.Add(headerData[i].Key, headerData[i].Value);
                    }
                }
            }
            catch (Exception ex)
            {

            }

            HttpResponseMessage resp = await httpClient.SendAsync(requestMessage);
            resp.EnsureSuccessStatusCode();

            var info = resp.Content.ReadAsStringAsync().Result;

            return resp;
        }


        /// <summary>
        /// 异步请求get(UTF-8)
        /// </summary>
        /// <param name="url">链接地址</param>       
        /// <param name="headerData">写在header中的内容</param>
        /// <returns></returns>
        public static async Task<HttpResponseMessage> HttpGetAsync(this HttpClient httpClient, string url, List<KeyValuePair<string, string>> headerData = null, string charset = "UTF-8", string mediaType = "application/x-www-form-urlencoded")
        {
           
            if (headerData == null)
            {
                headerData = new List<KeyValuePair<string, string>>();
            }
            HttpContent content = new FormUrlEncodedContent(headerData);
            if (headerData != null)
            {
                content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
                content.Headers.ContentType.CharSet = charset;

            }
            var request = new HttpRequestMessage()
            {
                RequestUri = new Uri(url),
                Method = HttpMethod.Get,
            };
            for (int i = 0; i < headerData.Count; i++)
            {
                request.Headers.Add(headerData[i].Key, headerData[i].Value);
            }
            var resp = await httpClient.SendAsync(request);


            return resp;
        }

        public static string ObjUrlEncode<T>(T model, Encoding encoding = null)
        {
            if (encoding == null)
            {
                encoding = Encoding.UTF8;
            }

            var t = model.GetType();
            var propertyList = t.GetProperties();
            var encodeStr =
                string.Join("&", propertyList
                .Where(w => w.GetValue(model, null) != null)
                .Cast<PropertyInfo>()
                .Select(s =>
                {
                    var str = "";
                    var value = s.GetValue(model, null);
                    if (value is DateTime dt)
                        str = s.Name + "=" + HttpUtility.UrlEncode(dt.ToString("yyyy-MM-dd HH:mm:ss.ffff"), encoding);
                    else
                        str = s.Name + "=" + HttpUtility.UrlEncode(value.ToString(), encoding);
                    return str;
                }).ToArray());

            return encodeStr;
        }

        //public async Task<HttpResponseMessage> HttpPostFileAsync(string uri, string url, List<ManagerFileInfo> files, List<KeyValuePair<string, string>> headerData = null, string charset = "UTF-8")
        //{
        //    var client = _httpClient;

        //    var content = new MultipartFormDataContent();
        //    //添加字符串参数,参数名为qq
        //    content.Add(new StringContent("123456"), "qq");

        //    string path = Path.Combine(System.Environment.CurrentDirectory, "1.png");
        //    //添加文件参数,参数名为files,文件名为123.png
        //    content.Add(new ByteArrayContent(System.IO.File.ReadAllBytes(path)), "file", "123.png");

        //    var requestUri = "http://192.168.1.108:56852/api/Test/SaveFile";
        //    var result = client.PostAsync(requestUri, content).Result.Content.ReadAsStringAsync().Result;



        //    client.SendAsync()
        //}

        public static async Task<HttpResponseMessage> HttpPutAsync(this HttpClient httpClient,string url, object bodyData, List<KeyValuePair<string, string>> urlAttach = null, List<KeyValuePair<string, string>> headerData = null, string charset = "UTF-8", string mediaType = "application/json")
        {
            StringBuilder tokenUriBuilder = new StringBuilder();

            tokenUriBuilder.Append(url);


            if (urlAttach != null && urlAttach.Count > 0)
            {
                tokenUriBuilder.Append("?");

                for (int i = 0; i < urlAttach.Count; i++)
                {
                    tokenUriBuilder.Append($"{urlAttach[i].Key}={urlAttach[i].Value}");
                    if (i < urlAttach.Count - 1)
                    {
                        tokenUriBuilder.Append("&");
                    }
                }

            }

            string tokenUri = tokenUriBuilder.ToString();
           

            var json = JsonConvert.SerializeObject(bodyData);

            var infoTemp = ObjUrlEncode(bodyData);

            HttpContent content = new StringContent(json);
            content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
            content.Headers.ContentType.CharSet = charset;

            HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Put, tokenUri);
            requestMessage.Content = content;

            try
            {
                if (headerData != null)
                {
                    for (int i = 0; i < headerData.Count; i++)
                    {
                        if (requestMessage.Headers.Contains(headerData[i].Key))
                        {
                            requestMessage.Headers.Remove(headerData[i].Key);

                        }
                        requestMessage.Headers.Add(headerData[i].Key, headerData[i].Value);
                    }
                }
            }
            catch (Exception ex)
            {

            }

            HttpResponseMessage resp = await httpClient.SendAsync(requestMessage);
            resp.EnsureSuccessStatusCode();

            var info = resp.Content.ReadAsStringAsync().Result;

            return resp;
        }


        public static async Task<HttpResponseMessage> HttpGetAsync(this HttpClient httpClient, string url, object bodyData, List<KeyValuePair<string, string>> urlAttach = null, List<KeyValuePair<string, string>> headerData = null, string charset = "UTF-8", string mediaType = "application/json")
        {
            StringBuilder tokenUriBuilder = new StringBuilder();

            tokenUriBuilder.Append(url);


            if (urlAttach != null && urlAttach.Count > 0)
            {
                tokenUriBuilder.Append("?");

                for (int i = 0; i < urlAttach.Count; i++)
                {
                    tokenUriBuilder.Append($"{urlAttach[i].Key}={urlAttach[i].Value}");
                    if (i < urlAttach.Count - 1)
                    {
                        tokenUriBuilder.Append("&");
                    }
                }

            }

            string tokenUri = tokenUriBuilder.ToString();
           

            var json = JsonConvert.SerializeObject(bodyData);

            var infoTemp = ObjUrlEncode(bodyData);

            HttpContent content = new StringContent(json);
            content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
            content.Headers.ContentType.CharSet = charset;

            HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, tokenUri);
            requestMessage.Content = content;

            try
            {
                if (headerData != null)
                {
                    for (int i = 0; i < headerData.Count; i++)
                    {
                        if (requestMessage.Headers.Contains(headerData[i].Key))
                        {
                            requestMessage.Headers.Remove(headerData[i].Key);

                        }
                        requestMessage.Headers.Add(headerData[i].Key, headerData[i].Value);
                    }
                }
            }
            catch (Exception ex)
            {

            }

            HttpResponseMessage resp = await httpClient.SendAsync(requestMessage);
            resp.EnsureSuccessStatusCode();



            return resp;
        }

    }
}

 

posted on 2022-02-14 00:39  SZMD.ls.nct  阅读(183)  评论(0)    收藏  举报

导航