使用 HttpClient 时如何不排除 Content-Type 中的字符集?

Posted

技术标签:

【中文标题】使用 HttpClient 时如何不排除 Content-Type 中的字符集?【英文标题】:How do I not exclude charset in Content-Type when using HttpClient? 【发布时间】:2016-10-26 23:17:06 【问题描述】:

我正在尝试在 .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 没有内容!是的......)。它不漂亮,但确实有效。

【问题讨论】:

可以改服务吗? 很遗憾我做不到。 【参考方案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 服务吗?我们想试试:) 很遗憾没有。肖恩和我找到了解决方法,但也感谢您的帮助。

以上是关于使用 HttpClient 时如何不排除 Content-Type 中的字符集?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HttpClient 发布数据?

如何使用 HttpClient 发布数据?

如何在发布时排除控制器?

如何使用HttpClient发布数据?

使用电子生成器构建电子时如何排除文件?

使用 HttpClient 时如何在 HttpContent 中设置大字符串?