如何在.NET 6.0中向GET请求添加Content-Type标头?

ggazkfy8  于 2023-04-07  发布在  .NET
关注(0)|答案(2)|浏览(433)

我的研究表明这是一件坏事。Content-Type明确地用于具有内容的消息,例如POST,PUT和(也许?)PATCH。
不幸的是,我公司的另一个团队决定,他们将要求对REST API发出的所有HTTPS请求都使用Content-Type,而且这种改变的可能性接近于零,尽管这违反了RFC 7231第3.1.5.5节。
(For参考,他们决定使用“Content-Type”来指定调用期望使用的API版本。
当我试着去做

HttpClient myHttpClient = new HttpClient() //code simplified for brevity

myHttpClient.DefaultRequestHeaders.Add("Content-Type", "application/json; version=3.0");

我得到一个运行时异常:

当我尝试:

myHttpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; version=3.0");

Content-Type头似乎没有添加。
我能做什么?

b4lqfgs4

b4lqfgs41#

我强烈建议不要这样做,但是我没有看到一种方法可以使用HttpRequestHeaders错误地使用允许的头。当它是一个标准的、众所周知的头时,TryAddWithoutValidation实际上并没有跳过验证头是可以接受的。
所以,你可以使用反射来作弊:

var hr = myHttpClient.DefaultRequestHeaders;
var customProp = typeof(HttpRequestHeaders).BaseType.GetField("_treatAsCustomHeaderTypes", BindingFlags.NonPublic|BindingFlags.Instance);
var cpVal = (byte)customProp.GetValue(hr);
customProp.SetValue(hr, (byte)(cpVal | 0b1000)); // add the Content headers to the custom header types so they will be allowed
hr.Add("Content-Type", "application/json; version=3.0");
customProp.SetValue(hr, cpVal); // reset to original only Response headers as custom headers

请注意,最好的答案可能是将头添加到每个HttpRequestMessage

olhwl3o2

olhwl3o22#

这个语法是最常见的,它被使用了上千次,并且工作正常。唯一的问题是我不确定你是否真的需要它。JSON默认是接受格式

var contentType = new MediaTypeWithQualityHeaderValue("application/json");
httpClient.DefaultRequestHeaders.Accept.Add(contentType);

相关问题