【问题标题】:Unsupported Media Type with HttpClient / .NET CoreHttpClient / .NET Core 不支持的媒体类型
【发布时间】: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>'

其中&lt;JSON&gt;&lt;URL&gt; 是有效的JSON 消息和端点的URL。从这个 Swagger 文档中,我收集到该端点的任何帖子都必须包含设置为 application/jsonContent-TypeAccept 标头。

我正在编写一个 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;

再一次,&lt;JSON&gt;&lt;URL&gt; 是有效的 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


【解决方案1】:

如果你试试呢:

var httpContent = new StringContent(jsonData, Encoding.UTF8, "application/json");

您不需要添加 Accept 标头。

【讨论】:

    猜你喜欢
    • 2019-08-02
    • 2017-07-08
    • 2020-10-06
    • 2019-08-23
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2017-08-19
    • 2020-09-03
    相关资源
    最近更新 更多