繁体   English   中英

C#将Accept标头添加到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是字符串类型的集合,您可以使用MediaTypeWithQualityHeaderValue的新实例添加要接受的标头。

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

DefaultRequestHeaders

有重载。

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

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

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

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

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

这个例子

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

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

你可以用它来写

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

或者您可以输入原始标头值:

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

我认为不存在差异,它只是通过Accept等属性添加标准头文件的一种简单方法,也方便通过Add方法添加自定义头文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM