版权声明:本文为博主原创文章,遵循 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 > )
{
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 > )
{
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 > )
{
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 > )
{
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 > )
{
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 > )
{
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);
}
}
}

C# 客户端网络请求 对HttpClient的封装的更多相关文章

  1. Flutter -------- 网络请求之HttpClient

    今天来说说Flutter中的网络请求,HttpClient网络请求,包含get,post get var data; _get() async { Map newTitle; var response ...

  2. React Native中的网络请求fetch和简单封装

    React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810 ...

  3. 一劳永逸的解决AFNetworking3.0网络请求问题(面向对象封装大法,block回调)

    AFNetworking在iOS网络请求第三方库中占据着半壁江山,前段时间将AFNetworking进行了3.0版本的迁移,运用面向对象的设计将代码进行封装整合,这篇文章主要为还在寻找AFNetwor ...

  4. swift项目第十天:网络请求工具类的封装

    import UIKit /* 必须先导入头文件:import AFNetworking */ import AFNetworking //MARK:-0:定义枚举:以枚举定义请求网络的get和pos ...

  5. 网络请求框架----HttpClient的get,post和图片上传服务器

    HttpClient是Apache Jakarta Common下的子项目,用来提供高效的.最新的.功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议.HttpCli ...

  6. Android 网络请求库volley的封装,让请求更方便

    首先封装一下volley 请求 public class CustomRequest extends StringRequest { private static final String TAG = ...

  7. 网络请求方法(SDK封装可以替换afn)

    //个人觉得 sdk开发时候 最好不要用第三方 最好可以用最原始的方法 替换 此处仅做sdk封装使用 留存+(void)GET:(NSString *)urlStr params:(NSDiction ...

  8. Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比

    比较的指标: 1.cpu 2.流量 3.电量 4.内存占用 5.联网时间 功能点: 1.重试机制 2.提供的扩展功能 3.易用性 4.是否https 5.是否支持reflect api,OkHttp有 ...

  9. Android网络请求框架

    本篇主要介绍一下Android中经常用到的网络请求框架: 客户端网络请求,就是客户端发起网络请求,经过网络框架的特殊处理,让后将请求发送的服务器,服务器根据 请求的参数,返回客户端需要的数据,经过网络 ...

随机推荐

  1. English-培训2-五大句型

  2. Vue动画操作

    概述 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CSS 动画库,如 Animate.c ...

  3. Android笔记(三十三) Android中线程之间的通信(五)Thread、Handle、Looper和MessageQueue

    ThreadLocal 往下看之前,需要了解一下Java的ThreadLocal类,可参考博文: 解密ThreadLocal Looper.Handler和MessageQueue 我们分析一下之前的 ...

  4. linux网络编程之system v共享内存

    接着上次的共享内存继续学习,这次主要是学习system v共享内存的使用,下面继续: 跟消息队列一样,共享内存也是有自己的数据结构的,system v共享内存也是随内核持续的,也就是说当最后一个访问内 ...

  5. test20181102 空间复杂度 和 test20181030 数独

    空间复杂度 考场做法 前有时间复杂度,后有空间复杂度. 但是这题不会有CE情况,所以较为好写. 就用map存复杂度,单层循环就搞定了. 至于判断维度的方法,我是用快读从字符串中读入. 然后不管常数,把 ...

  6. PL/SQL存储过程

    一.概述 过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储于数据库中. 并通过输入.输出和输入输出参数与其调用者交换信息.唯一区别是函数总向调用者返回数据. 二.存储过程详解 ...

  7. MySQL的索引优化,查询优化

    MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑架构图. MySQL逻辑架构,来自:高性能MySQL My ...

  8. urlrewrite与struts2结合使用基本配置

    1.更改web.xml,,,在struts2拦截器前面添加urlrewrite配置信息,,默认是forward的 <filter> <filter-name>UrlRewrit ...

  9. 2.3 vue配置(上)

    rm,在打包之前把上一次打包之后的东西删掉,然后webpack重新打包 通过DefinePlugin形成一个环境变量 HTML打包插件

  10. vue 单向数据流