提问者:小点点

如何设置HttpClient请求的Content-Type头?


我正在尝试按照我所调用的API的要求设置HttpClient对象的Content-Type头。

我尝试设置内容类型,如下所示:

using (var httpClient = new HttpClient())
{
    httpClient.BaseAddress = new Uri("http://example.com/");
    httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
    httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json");
    // ...
}

它允许我添加Accept头,但当我尝试添加Content-Type时,它会引发以下异常:

错误使用的标头名称。确保请求标头与HttpRequestMessage一起使用,响应标头与HttpRequestMessage一起使用,内容标头与HttpContent对象一起使用。

如何在HttpClient请求中设置Content-Type头?


共3个答案

匿名用户

内容类型是内容的头,而不是请求的头,这就是为什么失败的原因。Robert Levy建议的AddWithoutValidation可能行得通,但您也可以在创建请求内容本身时设置内容类型(注意,代码片段在两个地方添加了application/json-用于Accept和Content-Type头):

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://example.com/");
client.DefaultRequestHeaders
      .Accept
      .Add(new MediaTypeWithQualityHeaderValue("application/json"));//ACCEPT header

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "relativeAddress");
request.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}",
                                    Encoding.UTF8, 
                                    "application/json");//CONTENT-TYPE header

client.SendAsync(request)
      .ContinueWith(responseTask =>
      {
          Console.WriteLine("Response: {0}", responseTask.Result);
      });

匿名用户

对于那些没有看到约翰对卡洛斯解决方案的评论的人。。。

req.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

匿名用户

如果您不介意一个很小的库依赖关系,那么Flurl.HTTP[披露:我是作者]可以让它变得非常简单。它的PostJSONAsync方法负责序列化内容和设置Content-Type头,ReceiveJSON反序列化响应。如果需要accept头,您需要自己设置它,但是Flurl也提供了一种非常干净的方法:

using Flurl.Http;

var result = await "http://example.com/"
    .WithHeader("Accept", "application/json")
    .PostJsonAsync(new { ... })
    .ReceiveJson<TResult>();

Flurl实际上使用了HttpClient和JSON.NET,而且它是一个PCL,因此它可以在各种平台上工作。

PM> Install-Package Flurl.Http