【问题标题】:Unsupported media type in httpclient call c#httpclient调用c#中不支持的媒体类型
【发布时间】:2023-04-03 20:37:02
【问题描述】:

我正在尝试发布以下请求,但收到“不支持的媒体类型”响应。我将 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;

【问题讨论】:

    标签: c# rest


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2019-08-02
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      相关资源
      最近更新 更多