C#将Accept标头添加到HttpClient

evi*_*obu 15 c# httpclient dotnet-httpclient http-accept-header .net-core-2.0

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

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
Run Code Online (Sandbox Code Playgroud)

client.DefaultRequestHeaders
  .Accept
  .Add(new MediaTypeWithQualityHeaderValue("application/json"));
Run Code Online (Sandbox Code Playgroud)

我的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
[...]
Run Code Online (Sandbox Code Playgroud)

那么,除了这种奇怪的命名之外,没有什么可以在这里获得的吗?

Bar*_*r J 11

没有区别.

DefaultRequestHeaders.Accept是字符串类型的集合,您可以在其中添加要使用新实例接受的标头MediaTypeWithQualityHeaderValue.

client.DefaultRequestHeaders是一个字典,它接受请求标头的key和value,并根据它们匹配结果.

DefaultRequestHeaders
Run Code Online (Sandbox Code Playgroud)

有重载.

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

用户应该如何使用以及使用什么,这完全取决于用户.

  • 它们是有区别的.一种方法接受一切,即使它是畸形的.另一种特别接受具有品质因数的媒体类型 (6认同)

Pan*_*vos 11

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

HTTP 标准指定某些标头具有质量因子,因此名称为MediaTypeWithQualityHeaderValue。它是一个 MediaType 标头值,可以有一个质量因子。如果使用MediaTypeWithQualityHeaderValue Constructor (String, Double)构造函数则可以传递质量因子

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

这个例子

   Accept: audio/*; q=0.2, audio/basic
Run Code Online (Sandbox Code Playgroud)

应该被解释为“我更喜欢音频/基本,但如果在质量下降 80% 后它是最好的,请向我发送任何音频类型。”

你可以用

var requestAccepts=client.DefaultRequestHeaders.Accept;
requestAccepts.Add(new MediaTypeWithQualityHeaderValue("audio/*",0.2));
requestAccepts.Add(new MediaTypeWithQualityHeaderValue("audio/basic"));
Run Code Online (Sandbox Code Playgroud)

或者您可以使用以下命令输入原始标题值:

client.DefaultRequestHeaders.Add("Accept", "audio/*; q=0.2, audio/basic");
Run Code Online (Sandbox Code Playgroud)