【问题标题】:Can't set Content-Type header无法设置 Content-Type 标头
【发布时间】:2015-05-05 05:52:25
【问题描述】:

我在 HttpClient 上设置 Content-Type 时遇到问题。 我跟着这个问题:How do you set the Content-Type header for an HttpClient request? 但仍然没有运气。

String rcString = JsonConvert.SerializeObject(new RoadsmartChecks() { userguid = user_guid, coords = coordinates, radius = (radius * 100) + "" }, ROADSMART_JSON_FORMAT, JSONNET_SETTINGS);
HttpClient c = new HttpClient();
c.BaseAddress = new Uri(BASE_URL);
c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); //Keeps returning false
c.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", hash_aes);
c.DefaultRequestHeaders.TryAddWithoutValidation("Roadsmart-app", Constant.APP_ID);
c.DefaultRequestHeaders.TryAddWithoutValidation("Roadsmart-user", user_guid);
c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, BASE_URL + URL_CHECKS + "/fetch");
req.Content = new StringContent(rcString);
await c.SendAsync(req).ContinueWith(respTask =>
{
    Debug.WriteLine("Response: {0}", respTask.Result);
});

我也尝试过使用 Flurl 库,但在尝试添加“Content-Type”时它会崩溃。

misused header name content-type

那么我该如何强制它才能真正添加​​它? 提前致谢。

【问题讨论】:

    标签: c# windows-phone-8.1 httpclient flurl


    【解决方案1】:

    我觉得你应该试试这个

    req.Content = new StringContent(rcString, Encoding.UTF8, "application/json");
    

    查看此链接:

    How do you set the Content-Type header for an HttpClient request?

    编辑

    删除这行c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");并检查

    【讨论】:

    • 现在,正在设置标题,这是一回事。但我得到了 403。但是在 Postman 中,请求返回 json。
    • @TimRijckaert 这意味着它无法接受 json 结果。
    • 嗯,是的,我现在看到了问题所在。我的一个标题有“\”值“\”。所以我需要对字符串进行转义。
    【解决方案2】:

    更新:请参阅 new answer 了解非默认内容类型

    使用 Flurl,您不需要为 PostJsonAsync 之类的方法将 Content-Type 设置为 application/json。在这种情况下,这是默认的内容类型,它会为您设置。

    【讨论】:

    • 好吧,我的一个参数似乎被错误地转换了,所以我会再试一次 Flurl,因为它大大简化了代码。谢谢
    • 直到你遇到一个实际上需要你在 POST 请求上设置 Content-Type 标头的 api :-/
    • @qes 你是说你发布的是 JSON 格式的数据,但是 API 要求你设置一个 Content-Type other 而不是 application/json?
    • @ToddMenier 这是一个用于航班数据的soap xml api,我必须在发布xml请求正文时将其设置为text/xml,否则api返回415。我可能错过了,但我无法弄清楚如何让 Flurl 做到这一点。不过,上面使用 HttpClient 的 Ajay 解决方案对我有用。
    • @ToddMenier 是的,会导致无效操作异常:Misused header name。确保请求标头与 HttpRequestMessage 一起使用,响应标头与 HttpResponseMessage 一起使用,内容标头与 HttpContent 对象一起使用。它来自 System.Net.Http.Headers.HttpHeaders.Add(...)
    【解决方案3】:

    使用 Flurl 的最新和最好的答案是 upgrade。 2.0 在 headers dept 中引入了一些增强功能:

    1. 它们不再经过验证。 Flurl 现在在后台使用TryAddWithoutValidation,因此使用WithHeader(s) 方法您将永远不会收到“错误使用的标头名称”错误。 (我总是发现验证行为有点过度保护。)

    2. 在流畅的调用中,它们被设置在单个请求级别而不是FlurlClient 级别,因此在重用客户端时不会遇到concurrency issues

    3. 由于连字符在标头名称中很常见,但在 C# 标识符中不允许使用,因此有一个 new convention 将下划线转换为连字符,因此在指定多个时不必放弃对象表示法:

      url.WithHeaders(new { Content_Type = "foo", ... }
      

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 2013-07-22
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多