C# 客户端网络请求 对HttpClient的封装
时间:2019-09-24
本文章向大家介绍C# 客户端网络请求 对HttpClient的封装,主要包括C# 客户端网络请求 对HttpClient的封装使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1037949156/article/details/90022280
在写C#客户端程序时,或者在服务之间调用API时,我们往往会用到HttpClient来进行交互,这里我做了下简单的二次封装,并不定期更新。
下面是整个封装的HttpClient帮助类:
using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace Common { /// <summary> /// Summary: HttpClient公共类 /// Author: Lee Liu /// Date: 20190114 /// </summary> public class HttpClientHelper { private static HttpClientHelper httpClientHelper = null; private HttpClient httpClient; /// <summary> /// 构造方法私有,用于单例 /// </summary> private HttpClientHelper() { } /// <summary> /// 获取当前类的实例 /// </summary> /// <returns></returns> public static HttpClientHelper GetInstance() { if (httpClientHelper != null) { return httpClientHelper; } else { HttpClientHelper httpClientHelper = new HttpClientHelper(); //取消使用默认的Cookies HttpClientHandler handler = new HttpClientHandler() { UseCookies = false }; httpClientHelper.httpClient = new HttpClient(handler); return httpClientHelper; } } /// <summary> /// Get方法请求 /// </summary> /// <param name="url">请求地址</param> /// <returns></returns> public HttpResponseMessage Get(string url, List<KeyValuePair<string, string>> headers = null) { HttpRequestMessage request = new HttpRequestMessage() { RequestUri = new Uri(url), Method = HttpMethod.Get, }; if (headers != null && headers.Count > 0) { request.Headers.Clear(); foreach (var header in headers) { request.Headers.Add(header.Key, header.Value); } } HttpResponseMessage response = httpClient.SendAsync(request).Result; return response; } /// <summary> /// Get方法请求 /// </summary> /// <param name="url">请求地址</param> /// <returns></returns> public async Task<HttpResponseMessage> GetAsync(string url, List<KeyValuePair<string, string>> headers = null) { HttpRequestMessage request = new HttpRequestMessage() { RequestUri = new Uri(url), Method = HttpMethod.Get, }; if (headers != null && headers.Count > 0) { request.Headers.Clear(); foreach (var header in headers) { request.Headers.Add(header.Key, header.Value); } } return await httpClient.SendAsync(request); } /// <summary> /// Post方法请求 application/x-www-form-urlencoded格式 /// </summary> /// <param name="url">请求地址</param> /// <param name="paramList">参数集合</param> /// <returns></returns> public HttpResponseMessage Post(string url, List<KeyValuePair<String, String>> paramList, List<KeyValuePair<string, string>> headers = null) { FormUrlEncodedContent formUrlEncodedContent = new FormUrlEncodedContent(paramList); if (headers != null && headers.Count > 0) { formUrlEncodedContent.Headers.Clear(); foreach (var header in headers) { formUrlEncodedContent.Headers.Add(header.Key, header.Value); } } HttpResponseMessage response = httpClient.PostAsync(new Uri(url), formUrlEncodedContent).Result; return response; } public async Task<HttpResponseMessage> PostAsync(string url, List<KeyValuePair<String, String>> paramList, List<KeyValuePair<string, string>> headers = null) { FormUrlEncodedContent formUrlEncodedContent = new FormUrlEncodedContent(paramList); if (headers != null && headers.Count > 0) { formUrlEncodedContent.Headers.Clear(); foreach (var header in headers) { formUrlEncodedContent.Headers.Add(header.Key, header.Value); } } return await httpClient.PostAsync(new Uri(url), formUrlEncodedContent); } /// <summary> /// Post方法请求 raw data /// </summary> /// <param name="url">请求地址</param> /// <param name="content">raw data</param> /// <returns></returns> public HttpResponseMessage Post(string url, string content, List<KeyValuePair<string, string>> headers = null) { StringContent stringContent = new StringContent(content, Encoding.UTF8); if (headers != null && headers.Count > 0) { stringContent.Headers.Clear(); foreach (var header in headers) { stringContent.Headers.Add(header.Key, header.Value); } } HttpResponseMessage response = httpClient.PostAsync(new Uri(url), stringContent).Result; return response; } /// <summary> /// Post方法请求 raw data /// </summary> /// <param name="url">请求地址</param> /// <param name="content">raw data</param> /// <returns></returns> public async Task<HttpResponseMessage> PostAsync(string url, string content, List<KeyValuePair<string, string>> headers = null) { StringContent stringContent = new StringContent(content, Encoding.UTF8); if (headers != null && headers.Count > 0) { stringContent.Headers.Clear(); foreach (var header in headers) { stringContent.Headers.Add(header.Key, header.Value); } } return await httpClient.PostAsync(new Uri(url), stringContent); } /// <summary> /// 释放httpclient /// </summary> public void Release() { httpClient.Dispose(); } /// <summary> /// 设置默认请求头 /// </summary> /// <param name="name"></param> /// <param name="value"></param> public void SetDefaultHeaders(string name, string value) { httpClient.DefaultRequestHeaders.Add(name, value); } /// <summary> /// 删除默认请求头 /// </summary> /// <param name="name"></param> public void RemoveDefaultHeaders(string name) { httpClient.DefaultRequestHeaders.Remove(name); } } }
原文地址:https://www.cnblogs.com/superfeeling/p/11577371.html
- 数字供应链第六章-网络风险、知识产权盗窃、合规和数据挖掘业务合同
- 使命必达: 深入剖析WCF的可靠会话[实例篇](内含美女图片,定力差者慎入)
- 快速全面构建大数据认知体系
- 谈谈分布式事务之二:基于DTC的分布式事务管理模型[上篇]
- ConcurrencyMode.Multiple 模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[下篇]
- 谈谈分布式事务之二:基于DTC的分布式事务管理模型[上篇]
- 学习SpringMVC——拦截器
- 学习SpringMVC——国际化+上传+下载
- 行业研究:大数据(一)
- 控制并发访问的三道屏障: WCF限流(Throttling)体系探秘[下篇]
- 如何通过VPC在本机搭建局域网
- 你常用的10个MySQL命令
- WCF技术剖析之三十一: WCF事务编程[下篇]
- WCF技术剖析之三十一:WCF事务编程[上篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOs 7.*中配置安装phpMyAdmin的完整步骤记录
- Linux中怎么通过PID号找到对应的进程名及所在目录方法
- Apache环境下配置多个ssl证书搭建多个站点的方法
- 详解Linux手动释放缓存的方法
- 详解Centos7源码编译安装 php7.2之生产篇
- Centos7利用内存优化磁盘缓存读写速度的方法
- Redis过期策略和数据淘汰机制
- 图片由彩色渐变到黑白动画
- Kafka如何保证数据可靠性
- ubuntu中snap包的安装、更新删除与简单使用
- 学习在kernel态下使用NEON对算法进行加速的方法
- Centos7上Mesos和Marathon的安装和配置
- Redis高级数据类型-Bitmap和HyperLogLog
- Redis持久化策略
- 在linux下开启FTP服务方法介绍