C# 添加 Accept header 到 HttpClient

C# Add Accept header to HttpClient

这两个调用有什么区别?我的最终目标是拥有 Accept: application/json 通过网络发送,而不是附加到其他 MIME 类型的一些默认设置。

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");

对比

client.DefaultRequestHeaders
  .Accept
  .Add(new MediaTypeWithQualityHeaderValue("application/json"));

我的 CLR 是 .NET Core 2.0。

嗅探电线没有发现区别:

# just .Add("Accept"...
~ % nc -l 8000
GET / HTTP/1.1
Connection: Keep-Alive
Accept: application/json
[...]

# with MediaTypeWithQualityHeaderValue
~ % nc -l 8000
GET / HTTP/1.1
Connection: Keep-Alive
Accept: application/json
[...]

所以,除了那种奇怪的命名之外,这里没有其他收获对吧?

没有区别。

DefaultRequestHeaders.Accept 是字符串类型的 collection,您可以在其中添加 header 以接受使用 [= 的新实例11=].

client.DefaultRequestHeaders 是一个字典,它接受请求 header 的键和值,并根据它们匹配结果。

DefaultRequestHeaders

有过载。

它们之间唯一不同的是 DefaultRequestHeaders.Accept 将要求您初始化 MediaTypeWithQualityHeaderValue class 的新实例,从而在堆中产生另一个引用类型, 而 client.DefaultRequestHeaders 会将数据添加到字典中,从而消除了资源成本和初始化新实例的需要。

如何使用以及使用什么完全取决于用户。

我不认为有什么区别,这只是通过 Accept 等属性添加标准 headers 的一种更简单的方法,通过 Add 方法添加自定义 headers 也很方便。

只要名称和值正确,最终结果没有区别。

HTTP 标准指定certain headers have a quality factor, hence the name MediaTypeWithQualityHeaderValue. It's a MediaType header value that can have a Quality factor. You can pass the quality factor if you use the MediaTypeWithQualityHeaderValue Constructor (String, Double) 构造函数

标准中的 Accept header 部分显示了几个使用品质因数的示例。例如,

The example

   Accept: audio/*; q=0.2, audio/basic

SHOULD be interpreted as "I prefer audio/basic, but send me any audio type if it is the best available after an 80% mark-down in quality."

你可以用

来写
var requestAccepts=client.DefaultRequestHeaders.Accept;
requestAccepts.Add(new MediaTypeWithQualityHeaderValue("audio/*",0.2));
requestAccepts.Add(new MediaTypeWithQualityHeaderValue("audio/basic"));

或者您可以输入原始 header 值:

client.DefaultRequestHeaders.Add("Accept", "audio/*; q=0.2, audio/basic");