【发布时间】:2018-08-22 05:01:40
【问题描述】:
我正在使用支持 JSON 格式的 POST 请求的 RESTful API。 API 自己的 Swagger 文档表明这是对其端点之一的有效调用:
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '<JSON>' '<URL>'
其中<JSON> 和<URL> 是有效的JSON 消息和端点的URL。从这个 Swagger 文档中,我收集到该端点的任何帖子都必须包含设置为 application/json 的 Content-Type 和 Accept 标头。
我正在编写一个 C# 方法,该方法将使用 .NET Core 的 HttpClient 类发布到此端点。但是,在发布我的消息后,我收到了一个 HTTP 415 错误代码,用于不支持的媒体类型。根据我目前了解到的情况,必须在您的内容中设置 Content-Type 标头(我使用的是 StringContent 类),而 Accept 标头只能在 HttpClient 标头中设置。这是我的特定示例:
var httpContent = new StringContent("<JSON>", Encoding.UTF32, "application/json");
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var responseMessage = httpClient.PostAsync("<URL>", httpContent);
var result = responseMessage.Result;
再一次,<JSON> 和 <URL> 是有效的 JSON 消息和端点的 URL。在我看来,我引用httpCllient.DefaultRequestHeaders 的第三行没有将Accept: application/json 标头添加到我的请求中。如果我手动将标头添加到httpContent.Headers 集合,我会收到一个运行时错误,告诉我Accept 不是我可以添加到httpContent 的标头。这就是为什么我希望将它添加到httpClient 中。
我已经使用 Swagger 验证了 URL 和我的 JSON,所以我知道它们是正确的。此外,请求是通过 HTTPS 完成的,因此我无法使用 Fiddler 来验证是否包含 Accept 标头。虽然我可以在 Fiddler 中启用解密,但那完全是另一回事。我不想将他们的根证书添加到我的系统中,特别是如果我缺少一些相当简单的东西,这似乎是。
任何指针将不胜感激。谢谢。
【问题讨论】:
-
为什么是
UTF32而不是UTF8? -
好问题。我没有注意编码。将其更改为 UTF8 解决了该问题。由于下面有相同建议的答案,我接受了它作为答案。感谢 John Wu 和 Monty。
-
我在使用 content.Headers.Add("Content-Type", "application/json") 以满足 API 时也遇到了这个问题。似乎它仅在包含在 StringContent 构造函数中时才接受内容类型标头以及编码,如已接受的答案。
标签: c# .net-core http-headers dotnet-httpclient http-error