使用默认请求标头设置内容类型



使用HttpClient时,我读过使用DefaultRequestHeaders来设置 Post 请求的内容类型(例如"application/json"(的示例(例如此示例(。

我试图做这样的事情,但它失败了。我发送请求API抱怨它被发送了"不支持的类型"(当内容类型未设置为json时,它会说(。

之后,我添加了一行并解决了问题(您可以在下面的代码中看到注释中的行(。

我的问题是为什么这条线是必要的?如果我包含此行(即设置内容的内容类型(,这不会使"默认请求标头"设置变得不必要。如果有的话,这个"默认请求头"在做什么?

(我实际上尝试并评论了与DefaultRequestHeaders相关的行,并且它没有问题。那么DefaultRequestHeaders有什么好处呢?

我的代码是:

// Get the bytes for the request, should be pre-escaped
byte[] bytes = Encoding.UTF8.GetBytes(jsonEmployeeData);
client.BaseAddress = new Uri("the address here");
//  client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("customHeader", "blahblahblah");
ByteArrayContent byteContent = new ByteArrayContent(bytes);  //Make a new instance of HttpContent (an abstract class that can't be instantiated)
//THIS is the solution
//byteContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");  //If I UNCOMMENT THIS, IT WORKS!!
try
{
HttpResponseMessage response = await client.PostAsync("staff", byteContent);
Console.WriteLine(response.ToString());
}
catch (Exception ex)
{
Console.WriteLine("Something happened, oopps!" + ex.Message);
}
Console.WriteLine("Press any key");
Console.ReadLine();

顺便说一下,client是一个HttpClient

您调用的 API 需要请求内容是应用程序/json格式,因此您必须在内容中指定此格式。这就是为什么这行代码是你需要的:

byteContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");

关于生产线:

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

这是请求接受标头,它表示您希望服务器返回给您的响应内容类型。(您可以期望服务器返回另一种内容类型,如文本/纯,...(。希望这有帮助!

最新更新