0

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

我试图做这样的事情,但它失败了。我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

4

1 回答 1

1

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

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

关于线路:

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

这是request Accept header,它表示您期望服务器返回给您的响应的内容类型。(您可以期望服务器返回另一种内容类型,例如 text/plain,...)。希望这可以帮助!

于 2018-12-20T03:23:57.917 回答