httphandler设置自定义请求头

httphandler设置自定义请求头,第1张

4种为HttpClient添加默认请求头的方式。下面详细的介绍;

第一种方式

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

class Program

{undefined

static Task Main()=>SendAsync1()

private static async Task SendAsync1()

{undefined

var httpClient = new HttpClient()

AddDefaultHeaders(httpClient)

await httpClient.GetStringAsync("http://localhost:5000/")

}

private static void AddDefaultHeaders(HttpClient httpClient)

{undefined

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

{undefined

static Task Main()=>SendAsync2()

private static async Task SendAsync2()

{undefined

var services = new ServiceCollection()

services.AddHttpClient("", AddDefaultHeaders)

var httpClient = services

.BuildServiceProvider()

.GetRequiredService()

.CreateClient()

await httpClient.GetStringAsync("http://localhost:5000/")

}

private static void AddDefaultHeaders(HttpClient httpClient)

{undefined

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

{undefined

static Task Main()=>SendAsync3()

private static async Task SendAsync3()

{undefined

Func requestAccessor = null

DiagnosticListener.AllListeners.Subscribe(listener =>

{undefined

if (listener.Name == "HttpHandlerDiagnosticListener")

{undefined

listener.Subscribe(kv =>

{undefined

if (kv.Key == "System.Net.Http.HttpRequestOut.Start")

{undefined

requestAccessor ??= BuildRequestAccessor(kv.Value.GetType())

var request = requestAccessor(kv.Value)

AddDefaultHeaders(request)

}

})

}

})

var httpClient = new HttpClient()

await httpClient.GetStringAsync("http://localhost:5000/")

static Func BuildRequestAccessor(Type payloadType)

{undefined

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>(convert, payload).Compile()

}

}

private static void AddDefaultHeaders(HttpRequestMessage request)

{undefined

request.Headers.Add("x-www-foo", "123")

request.Headers.Add("x-www-bar", "456")

request.Headers.Add("x-www-baz", "789")

}

}

第四种方式

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

class Program

{undefined

static Task Main()=>SendAsync4()

private static async Task SendAsync4()

{undefined

DiagnosticListener.AllListeners.Subscribe(listener =>

{undefined

if (listener.Name == "HttpHandlerDiagnosticListener")

{undefined

listener.SubscribeWithAdapter(new HttpClientListener())

}

})

var httpClient = new HttpClient()

await httpClient.GetStringAsync("http://localhost:5000/")

}

private sealed class HttpClientListener

{undefined

[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)

{undefined

request.Headers.Add("x-www-foo", "123")

request.Headers.Add("x-www-bar", "456")

request.Headers.Add("x-www-baz", "789")

}

}

可以通过win.setRequestHear(name,value)来修改

参数为两个

第一个为Name,为字段名,例如Date

第二个为Value,为字段值,例如Wed, 01 Mar 2009 12:00:00 GMT

http协议中,客户端和服务端通过发送纯文本(ASCII)消息的方式进行通信,客户端发送请求(requests)到服务端,服务端发送响应(responses)到客户端。

请求消息格式

例子:

响应消息格式

例子:

为了标识特定资源需要特定的行为访问,HTTP协议定义了多种请求方法。这种特定资源是什么样的,是已有的数据,还有动态生成的?主要依赖于服务端实现。通常来说这种资源对应一个文件或者属于服务端的一个可执行输出。

HTTP/1.0规范定义三种请求方法:GET, POST, HEAD。HTTP/1.1规范又增加了五种:OPTIONS, PUT, DELETE, TRACE,CONNECT。

在规范中定义的这些请求方法是语义化的,并且是可依赖的。任何客户端都可以使用任何请求方法,服务端也可以配置成支持任何这些请求方法的组合。

实际上这些请求方法可以随意定义,没有数量限制,不过你自己定义出来的请求方法会被认为是不安全并且是非幂等的。

总结 :这些请求方法本质上没有区别,最终都是TCP请求,唯一的区别就是每个请求方法,使用的时候,规范规定的使用格式不同,原则上必须按照规范规定的格式使用,其实也可以违反规范使用,比如你可以使用GET方法请求数据,也可以使用GET方法提交数据,当然你可以用POST方法提交数据,也可以用POST方法获取数据。

做好前端开发必须对HTTP的相关知识有所了解,所以我创建了一个专题 前端必备HTTP技能 专门收集前端相关的HTTP知识,欢迎关注,投稿。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11619536.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存