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#中不支持的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net Core Web API:GET 请求中不支持的媒体类型