我正在尝试按照我所调用的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
头?
内容类型是内容的头,而不是请求的头,这就是为什么失败的原因。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