others - 对于HttpClient请求,怎么设置内容类型(Content-Type)头?

我正在尝试根据要调用的API设置HttpClient对象的Content-Type标头。

我尝试如下设置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标头?

时间:

内容类型是内容的header,而不是请求,这就是为什么失败的原因,


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

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

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

调用AddWithoutValidation而不是Add (查看MSDN链接 )。

或者,我猜你正在使用的API实际上仅需要POST或PUT请求(而不是普通的get请求),在这种情况下,当你调用HttpClient.PostAsync并传入HttpContent时,将此设置为该HttpContent对象的Headers属性。

...