httpclient调用c#中不支持的媒体类型

Posted

技术标签:

【中文标题】httpclient调用c#中不支持的媒体类型【英文标题】:Unsupported media type in httpclient call c# 【发布时间】:2021-01-19 06:45:48 【问题描述】:

我正在尝试发布以下请求,但收到“不支持的媒体类型”响应。我将 Content-Type 设置为 application/json。任何帮助,将不胜感激。根据下面的评论,如果我将内容更改为 'new StringContent(JsonConvert.SerializeObject(root), Encoding.UTF8, "application/json")' 那么我会收到错误的请求响应

string URL = "https://test.com/api/v2/orders/";  //please note it is dummy api endpoint
            var client = new HttpClient();
            var httpRequestMessage = new HttpRequestMessage
            
                Method = HttpMethod.Post,
                RequestUri = new Uri(URL),
                Headers = 
                             HttpRequestHeader.Authorization.ToString(), "Bearer ABcdwenlfbl8HY0aGO9Z2NacFj1234" ,  //please note it is dummy bearer token
                             HttpRequestHeader.Accept.ToString(), "application/json;indent=2" ,
                             HttpRequestHeader.ContentType.ToString(), "application/json" 
            ,
                //Content =new StringContent(JsonConvert.SerializeObject(root), Encoding.UTF8, "application/json")
                Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(root))
            ;
            var response = client.SendAsync(httpRequestMessage).Result;

【问题讨论】:

【参考方案1】:

使用HttpClient,一些标头被计为请求标头,而其他标头则被计为内容标头。我不确定他们为什么真的做出这种区分,但最重要的是您必须在正确的位置添加标题。

对于Content-Type,它可以作为StringContent 构造函数的一部分添加,或者添加到构造的StringContent 对象中。

我的做法是使用构造函数:

Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(root), System.Text.Encoding.UTF8, "application/json");

或者在之后设置它:

Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(root))
Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

注意:如果您的问题在进行此更改后仍然存在,则可能是服务器端问题,您需要联系 API 的维护者,询问您做错了什么。

【讨论】:

但是,当我添加这个: Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(root), System.Text.Encoding.UTF8, "application/json");然后我得到响应为“错误请求”状态代码:400,ReasonPhrase:“错误请求”,版本:1.1,内容:System.Net.Http.StreamContent,标题:连接:保持活动变化:接受变化:Cookie变化: Origin Referrer-........ 这不是服务器端的问题,因为它在 POSTMAN 调用中运行良好。 好的,您需要做的是使用 Telerik 的 Fiddler 之类的工具来捕获 Postman 和 .NET 请求,然后将您的 Postman 请求与失败的 .NET 请求进行比较他们的原始形式。我会争辩说,由于您没有收到“错误请求”,因此您当前的问题所涉及的问题已经解决:服务器现在可以理解该请求,但由于某种原因它对此不满意。您应该获取我建议的信息并发布有关该问题的新问题。 P.S.请注意,即使请求失败响应代码,您也可以读取响应内容。如果服务器的响应有帮助,它还可能让您了解问题所在。 在此标题下实施解决方案后或者在之后设置它:我不再敲我的头了!谢谢你的回答..【参考方案2】:

我更喜欢使用一些第三方包装器,例如 FluentClient 请注意,您不应该为每个请求实例化一个新对象,O 只是为了示例而这样做。

var client = new FluentClient("https://test.com/api/v2/orders/")
.PostAsync(URI)
.WithBody(root)
.WithBearerAuthentication("ABcdwenlfbl8HY0aGO9Z2NacFj1234");
var response = await client.AsResponse();

【讨论】:

以上是关于httpclient调用c#中不支持的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章

C#中HttpClient使用注意:预热与长连接

邮递员中不支持的媒体类型

ASP.Net Core Web API:GET 请求中不支持的媒体类型

在 WinRT HttpClient 上设置请求 Content-Type

.Net HttpClient 如何管理多种媒体类型

来自 C# 控制器的 Angular http post formData 不受支持的媒体类型