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

6
我将尝试在一个 .net core 项目中使用 HttpClient 来向一个接受/返回 JSON 的 REST 服务发起 GET 请求。我无法控制外部服务。
不管我如何尝试,我都无法弄清楚如何将 Content-Type 头设置为仅为 application/json。
当我使用以下方式时:
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

它通过HTTP GET请求发送:

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

然而,这个特定的服务与此不兼容。只有在标题为以下情况下才能正常工作:

Content-Type: application/json

我尝试过不进行验证设置头文件,但我在网络和SO上找到的所有方法都不适用于.NET Core。 所有其他发送HTTP请求的方法在.NET Core中都不可用,因此我需要解决这个问题。 我该如何在 content-type 中排除字符集?
更新:
正如答案中提到的,服务应该使用 Accept header。 解决方法(Shaun Luttin在他的答案中提到)是向GET请求添加一个空内容(什么?GET请求没有内容!是的...)。 这不太好,但确实有效。

1
你能改变这个服务吗? - Daniel A. White
很遗憾,我不能。 - Erick T
2个回答

15

你正在设置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设置为“通用”标头。 - Erick T
Content-Type是POST请求的一部分,而不是GET请求。也就是说,GET请求不会有Content-Type头,因为您不会发布任何内容。 - Shaun Luttin
1
我从 HTTP 的角度很欣赏,但该服务使用 content-type 头来确定要发送哪种格式(JSON、XML 或 MsgPack)。它应该使用 Accept 头吗?可能是的,但它没有。 - Erick T
1
谢谢Shaun,我想我们同时尝试了同样的事情。 :) - Erick T

0
如果您是客户端并执行GET请求,如何指定Content-Type?难道不应该说明您能够Accept什么吗?根据7.2.1 Type,只有在存在Body时才能设置Content-Type

问题在于服务在这里没有做正确的事情。它混淆了Accept和Content-Type(它在get和post请求中都使用Content-Type)。这是正确的吗?不,但我仍然必须与它一起工作。 - Erick T
哎呀呀...这不太好。你能分享一下 REST 服务吗?我们想试试 :) - Searching
很不幸,没有。Shaun和我找到了一个解决方法,但还是谢谢你的帮助。 - Erick T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接