四种为HttpClient添加默认请求报头的解决方案

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");
    }
}

原文地址:https://www.cnblogs.com/artech/p/add-headers-for-httpclient.html

时间: 2024-08-30 05:58:09

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

android点击事件的四种方式

第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; imp

事务的四种隔离级别和七种传播行为

很多人容易搞混不可重复读和幻读,确实这两者有些相似.但不可重复读重点在于update和delete,而幻读的重点在于insert. 避免不可重复读需要锁行就行 避免幻影读则需要锁表 如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了.但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数

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(url); // 先封装一个 JSON 对象 JSONObject param = new JSONObject(); param.put("name", "rarnu"); param.put("password", "123456"

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

Django默认开启防止csrf(跨站点请求伪造)攻击,在post请求时,没有上传 csrf字段,导致校验失败,报403错误 解决方法1: 注释掉此段代码,即可. 缺点:导致Django项目完全无法防止csrf攻击 解决方法2: 在 views.py文件中 #导入,可以使此次请求忽略csrf校验 from django.views.decorators.csrf import csrf_exempt #在处理函数加此装饰器即可 @csrf_exempt def post(request): na

python写http post请求的四种请求体

Web自动化测试(25) HTTP 协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式.常见的四种编码方式如下: 1.application/x-www-form-urlencoded 这应该是最常见的 POST 提交数据的方式了.浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据.请求类似于下面这样(无关的请求头在本文中

ThinkPHP的URL模式有四种,默认的PATHINFO模式

ThinkPHP的URL模式有四种,默认是PATHINFO模式,其他三种分别为:普通模式.REWRITE和兼容模式. 浏览器输入格式为:http://localhost/demo39/index.php/模块/控制器/操作 在Home的Controller建立UserController.calss.php,如下图所示: 在浏览器上输入 http://localhost/demo39/index.php/Home/User 得到的结果为: user index 这时在浏览器中输入上面所说的输入格

Jmeter添加变量的四种方法

一.在样本中添加同请求一起发送的参数.根据服务器设置的数据类型,来添加不同类型的参数 二.用户定义的变量 1.创建:添加->配置元件->用户定义的变量 2.作用:当前的线程组内所有Sampler都可以引用变量,方便脚本更新:当参数发生变化时,只要在[用户定义的变量]中更新对应变量的参数即可,不需要逐个修改每个http中的参数 3.变量定义:可以是具体的值,也可以是函数(函数可自动生成:选项->函数助手对话框) 4.变量引用:Sample中引用变量的格式为${变量名} 三.函数助手对话框-

Fiddler模拟post四种请求数据

前言: Fiddler是一个简单的http协议调试代理工具,它界面友好,易于操作,是模拟http请求的利器之一. 在接口测试中,接口通常是get请求或者post请求.get请求的测试一般较为简单,只需设置好相关的请求头,url写正确即可.但是在测试post请求时,请求数据格式的设置往往就稍显复杂.尤其是在开发人员的接口文档描述不清楚的情况下,会影响到测试效率. 故而本文总结了下post请求常见的四种数据格式和对应的fiddler模拟请求的构造方法. post请求主体详解: 对于get请求来说没有

【Python】Http Post请求四种请求体的Python实现

前言 前几天一个刚接触Python不深的朋友问我的Python的xml格式Post请求怎么发送,刚好最近也在看Http请求相关的内容,所以决定总结一下. Content-Type Content-Type的作用 HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据.一个正常的post请求主要包括请求行,请求头,请求主体.协议规定 POST 提交的数据必须放