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

时间:2018-06-25 06:10:37

标签: dotnet-httpclient httpcontent

使用HttpClient时,我已阅读了使用DefaultRequestHeaders设置Post请求的内容类型(例如“ application / json”)的示例(例如this example)。

我试图做这样的事情,但是失败了。我正在发送请求的API抱怨说它被发送了“不受支持的类型”(当内容类型未设置为json时,它表示该状态)。

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

我的问题是,为什么这行是必需的?而且,如果我包括这一行(即设置 content 的内容类型),则不需要“默认请求标头”设置。这个“默认请求标头”在做什么?

(我实际上尝试并评论了与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

1 个答案:

答案 0 :(得分:0)

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

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

关于该行:

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

这是请求 Accept 标头,它表示服务器希望返回给您​​的响应的内容类型。 (您可以期望服务器返回其他内容类型,例如text / plain,...)。希望这可以帮助!