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) 收藏 举报
浙公网安备 33010602011771号