【问题标题】:How do I not exclude charset in Content-Type when using HttpClient?使用 HttpClient 时如何不排除 Content-Type 中的字符集?
【发布时间】:2023-03-11 12:35:01
【问题描述】:

我正在尝试在 .net 核心项目中使用 HttpClient 向接受/返回 JSON 的 REST 服务发出 GET 请求。我不控制外部服务。

无论我如何尝试,我都无法将 Content-Type 标头设置为 application/json only。

当我使用时

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

它在 HTTP GET 请求中发送:

Content-Type: application/json; charset=utf-8

但是,此特定服务不适用于此。仅当标题为:

Content-Type: application/json

我尝试在没有验证的情况下设置标头,并且我在 web/SO 上找到的所有方法都不适用于 .net 核心。所有其他发送 HTTP 请求的方法在 .net 核心中都不可用,所以我需要弄清楚这一点。如何排除内容类型中的字符集?

使用解决方法进行编辑

如答案中所述,服务应使用 Accept 标头。解决方法(正如 Shaun Luttin 在他的回答中所说)是向 GET 添加一个空内容(什么?GET 没有内容!是的......)。它不漂亮,但确实有效。

【问题讨论】:

  • 可以改服务吗?
  • 很遗憾我做不到。

标签: c# .net asp.net-core dotnet-httpclient


【解决方案1】:

您正在设置 Accept 标头。您需要设置 ContentType 标头,这仅适用于 POST。

var client = new HttpClient();
var content = new StringContent("myJson");
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
var result = client.PostAsync("http://bigfont.ca", content).Result;

如果你真的想为 GET 设置它,你可以这样做:

var client = new HttpClient();
var message = new HttpRequestMessage(HttpMethod.Get, "http://www.bigfont.ca");
message.Content = new StringContent(string.Empty);
message.Content.Headers.Clear();
message.Content.Headers.Add("Content-Type", "application/json");
var result = client.SendAsync(message).Result;

【讨论】:

  • 关于如何做到这一点的任何建议? HttpClient API 似乎不允许将 Content-Type 设置为“通用”标头
  • Content-Type 是 POST 请求的一部分,而不是 GET。也就是说,GET 不会有 Content-Type 标头,因为您没有发布任何内容。
  • 从 HTTP 的角度来看,我很欣赏这一点,但服务使用 get 中的内容类型标头来确定要发回的格式(json、xml 或 msgpack)。它应该使用 Accept 标头吗?可能,但事实并非如此。
  • 谢谢肖恩,我想我们都同时尝试了同样的事情。 :)
【解决方案2】:

如果您是客户并执行GET 请求,您如何指定Content-Type?它不应该说你能Accept吗?根据这个7.2.1 Type你只能在有Body的时候设置Content-Type。

【讨论】:

  • 问题是服务在这里没有做正确的事情。它混淆了 Accept 和 Content-Type(它使用 Content-Type 来获取和发布。它是正确的吗?不,但我仍然必须使用它。
  • 哎呀……这不好。您可以共享 REST 服务吗?我们想试试:)
  • 很遗憾没有。肖恩和我找到了解决方法,但也感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2019-02-18
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多