HttpClient在Web调用中具有广泛的应用,而为它添加默认请求头是我们经常遇到的需求,本文介绍4种为HttpClient添加默认请求头的方式。

第一种方式

直接在创建的HttpClient对象的DefaultRequestHeaders集合中添加报头。

class Program
{
static Task Main()=> SendAsync1(); private static async Task SendAsync1()
{
var httpClient = new HttpClient();
AddDefaultHeaders(httpClient);
await httpClient.GetStringAsync("http://localhost:5000/");
} private static void AddDefaultHeaders(HttpClient httpClient)
{
httpClient.DefaultRequestHeaders.Add("x-www-foo", "123");
httpClient.DefaultRequestHeaders.Add("x-www-bar", "456");
httpClient.DefaultRequestHeaders.Add("x-www-baz", "789");
}
}

第二种方式

对于.NET Core应用来说,我们更推荐的做法是采用依赖注入的方式,利用IHttpClientFactory来创建HttpClient对象,那么我们在进行相关服务注册的时候就可以设置默认请求报头。

class Program
{
static Task Main()=> SendAsync2(); private static async Task SendAsync2()
{
var services = new ServiceCollection();
services.AddHttpClient("", AddDefaultHeaders);
var httpClient = services
.BuildServiceProvider()
.GetRequiredService<IHttpClientFactory>()
.CreateClient();
await httpClient.GetStringAsync("http://localhost:5000/");
} private static void AddDefaultHeaders(HttpClient httpClient)
{
httpClient.DefaultRequestHeaders.Add("x-www-foo", "123");
httpClient.DefaultRequestHeaders.Add("x-www-bar", "456");
httpClient.DefaultRequestHeaders.Add("x-www-baz", "789");
}
}

第三种方式

由于HttpClient在发送请求的时候会利用DiagnosticSource对象发送相应的诊断事件,并且将作为请求的HttpRequestMessage对象作为请求事件内容负载。我们可以订阅该事件,在请求被发送之前将其拦截下来,并添加相应的请求头即可。

class Program
{
static Task Main()=> SendAsync3(); private static async Task SendAsync3()
{
Func<object, HttpRequestMessage> requestAccessor = null;
DiagnosticListener.AllListeners.Subscribe(listener =>
{
if (listener.Name == "HttpHandlerDiagnosticListener")
{
listener.Subscribe(kv =>
{
if (kv.Key == "System.Net.Http.HttpRequestOut.Start")
{
requestAccessor ??= BuildRequestAccessor(kv.Value.GetType());
var request = requestAccessor(kv.Value);
AddDefaultHeaders(request);
}
});
}
}); var httpClient = new HttpClient();
await httpClient.GetStringAsync("http://localhost:5000/");
static Func<object, HttpRequestMessage> BuildRequestAccessor(Type payloadType)
{
var property = payloadType.GetProperty("Request", BindingFlags.Instance | BindingFlags.Public);
var payload = Expression.Parameter(typeof(object));
var convertedPayload = Expression.Convert(payload, payloadType);
var getRequest = Expression.Call(convertedPayload, property.GetMethod);
var convert = Expression.Convert(getRequest, typeof(HttpRequestMessage));
return Expression.Lambda<Func<object, HttpRequestMessage>>(convert, payload).Compile();
}
} private static void AddDefaultHeaders(HttpRequestMessage request)
{
request.Headers.Add("x-www-foo", "123");
request.Headers.Add("x-www-bar", "456");
request.Headers.Add("x-www-baz", "789");
}
}

第四种方式

上面这种方式可以采用强类型编程方式,具体的代码如下。

class Program
{
static Task Main()=> SendAsync4(); private static async Task SendAsync4()
{
DiagnosticListener.AllListeners.Subscribe(listener =>
{
if (listener.Name == "HttpHandlerDiagnosticListener")
{
listener.SubscribeWithAdapter(new HttpClientListener());
}
}); var httpClient = new HttpClient();
await httpClient.GetStringAsync("http://localhost:5000/");
} private sealed class HttpClientListener
{
[DiagnosticName("System.Net.Http.HttpRequestOut.Start")]
public void OnSend(HttpRequestMessage request) => AddDefaultHeaders(request); //Must subscribute the System.Net.Http.HttpRequestOut event.
[DiagnosticName("System.Net.Http.HttpRequestOut")]
public void OnSend() { }
} private static void AddDefaultHeaders(HttpRequestMessage request)
{
request.Headers.Add("x-www-foo", "123");
request.Headers.Add("x-www-bar", "456");
request.Headers.Add("x-www-baz", "789");
}
}

四种为HttpClient添加默认请求报头的解决方案的更多相关文章

  1. (七)四种常见的post请求中的参数形式

    原文链接:https://blog.csdn.net/jiadajing267/article/details/87883725 1).HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP ...

  2. Android Activity的四种经典传值方法

    文/ http://blog.csdn.net/sk719887916/article/details/41723613  skay 开发中遇到多个activity的传值问题 相邻两个之间的传值 或者 ...

  3. Android四种启动模式

    四种启动模式 standard(默认) singleTop singleTast singleInstance standard(默认) 系统默认的启动模式. Android是使用返回栈来管理活动的, ...

  4. android点击事件的四种方式

    android点击事件的四种方式 第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; im ...

  5. this的四种绑定规则总结

    一.默认绑定 1.全局环境中,this默认绑定到window 2.函数独立调用时,this默认绑定到window console.log(this === window);//true functio ...

  6. httpClient Post例子,Http 四种请求访问代码 HttpGet HttpPost HttpPut HttpDelete

    httpclient post方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //----1. HttpPost request = new HttpPost(ur ...

  7. Python实现接口测试中的常见四种Post请求数据

    前情: 在日常的接口测试工作中,模拟接口请求通常有两种方法, 利用工具来模拟,比如fiddler,postman,poster,soapUI等 利用代码来模拟,使用到一些网络模块,比如HttpClie ...

  8. 接口测试中模拟post四种请求数据

    https://www.jianshu.com/p/3b6d7aa2043a 一.背景介绍 在日常的接口测试工作中,模拟接口请求通常有两种方法,fiddler模拟和HttpClient模拟. Fidd ...

  9. Django的POST请求时因为开启防止csrf,报403错误,及四种解决方法

    Django默认开启防止csrf(跨站点请求伪造)攻击,在post请求时,没有上传 csrf字段,导致校验失败,报403错误 解决方法1: 注释掉此段代码,即可. 缺点:导致Django项目完全无法防 ...

随机推荐

  1. java - tcp如何保证传输的可靠性和有序性

    TCP提供的是一种面向连接的,可靠性的字节流服务. 可靠性: 1.应用数据被TCP划分为最适合发送的数据包: 2.在TCP发送一个数据块后,将启动一个定时器,用以接收目的端的确认信息,若不能及时得到确 ...

  2. Python秒算24点,行还是不行?

    周末闲来无事,看到隔壁家的老王在和隔壁家的媳妇玩24点,就进屋看了看.发现老王是真不行啊,那不行,这也不行. 就连个24点都玩不过他媳妇,给他媳妇气的,啥都不能满足,这不能,那也不能. 我坐下来和他媳 ...

  3. @ConfigurationProperties 注解使用姿势,这一篇就够了

    在编写项目代码时,我们要求更灵活的配置,更好的模块化整合.在 Spring Boot 项目中,为满足以上要求,我们将大量的参数配置在 application.properties 或 applicat ...

  4. spring-Scheduler

    作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权所有,欢迎保留原文链接进行转载:) 在我们的项目开发过程中,经常需要定时任务来帮助我们来做一些内容,springboot默 ...

  5. Python装饰器 (转)

    多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身. #多个装饰器 import time def deco01(func): def wrapper(*args, ** ...

  6. 【iOS】创建真机调试证书

    今天第一次完整的在一个开发者账号里添加证书,刚接触,还真有些不熟悉,还好找到了一篇不错的文章:iOS开发:创建真机调试证书 ,做了很详细的介绍. 分享一下!!

  7. Java----面向对象(继承&多态)

    一.继承 什么是继承 ? 让类与类之间产生了子父类关系 ; 继承的好处是: 提高代码的复用性和维护性 java中继承的特点是: 只支持单继承.不支持多继承,但是可以多层继承; 四种权限修饰符是 : p ...

  8. SmartSql使用教程(4)——多库配置与使用

    一.引言 已经几个月没更新了.本来上一章的预告是准备写TypeHandler的相关特性的.但是在准备的时候.SmartSql的作者重构了一下TypeHandler,使得我一下子没搞懂TypeHandl ...

  9. 02、Java的lambda表达式和JavaScript的箭头函数

    前言 在JDK8和ES6的语言发展中,在Java的lambda表达式和JavaScript的箭头函数这两者有着千丝万缕的联系:本次试图通过这篇文章弄懂上面的两个"语法糖". 简介 ...

  10. Docker:跨主机通信

    修改主机docker默认的虚拟网段,然后在各自主机上分别把对方的docker网段加入到路由表中,配合iptables即可实现docker容器夸主机通信.配置方法如下: 设有三台虚拟机 v1: 10.1 ...