为HttpClient请求键入标头?

我试图设置一个HttpClient对象的Content-Type头部,这是我所调用的API所要求的。

我尝试设置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一起使用,使用HttpResponseMessage响应头以及使用HttpContent对象的内容头。

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


内容类型是内容的头部,而不是请求的头部,这就是失败的原因。 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
链接地址: http://www.djcxy.com/p/8067.html

上一篇: Type header for an HttpClient request?

下一篇: type to 'application/json' in jQuery.ajax