首页 > 解决方案 > HttpClient / .NET Core 不支持的媒体类型

问题描述

我正在使用支持 JSON 格式的 POST 请求的 RESTful API。API 自己的 Swagger 文档显示这是对其端点之一的有效调用:

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '<JSON>' '<URL>'

有效 JSON 消息和端点 URL 的位置和位置<JSON>。从这个 Swagger 文档中,<URL>我收集到该端点的任何帖子都必须包括设置为.Content-TypeAcceptapplication/json

我正在编写一个 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 中启用解密功能,但那完全是另一回事了。我不想将他们的根证书添加到我的系统中,特别是如果我缺少一些相当简单的东西,这似乎是。

任何指针将不胜感激。谢谢。

标签: c#.net-corehttp-headersdotnet-httpclienthttp-error

解决方案


如果你尝试怎么办:

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

您不需要添加 Accept 标头。


推荐阅读