将Http标头添加到HttpClient


158

所有:

在将请求发送到Web服务之前,我需要将HTTP标头添加到HttpClient中。我该如何针对单个请求(而不是对所有将来的请求使用HttpClient)?我不确定这是否可能。

var client = new HttpClient();
var task =
    client.GetAsync("http://www.someURI.com")
    .ContinueWith((taskwithmsg) =>
    {
        var response = taskwithmsg.Result;

        var jsonTask = response.Content.ReadAsAsync<JsonObject>();
        jsonTask.Wait();
        var jsonObject = jsonTask.Result;
    });
task.Wait();

Answers:


245

创建一个HttpRequestMessage,将Method设置为GET,设置标题,然后使用SendAsync代替GetAsync

var client = new HttpClient();
var request = new HttpRequestMessage() {
    RequestUri = new Uri("http://www.someURI.com"),
    Method = HttpMethod.Get,
};
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));
var task = client.SendAsync(request)
    .ContinueWith((taskwithmsg) =>
    {
        var response = taskwithmsg.Result;

        var jsonTask = response.Content.ReadAsAsync<JsonObject>();
        jsonTask.Wait();
        var jsonObject = jsonTask.Result;
    });
task.Wait();

2
谢谢,达雷尔!HttpClient直到我看到你可以做到这一点,我才感到失望。
2013年

23
@Talon就是406的意思。客户端要求提供服务器不支持的媒体类型。如果您不在乎所用的媒体类型,请不要要求任何一种。OP只是问如何在请求中添加标头。我只是随机选择一个例子。
Darrel Miller

15
你可能想这些天var response = await client.SendAsync,而不是ContinueWithtask.Wait()
迈克尔·帕克

1
@MichaelParker确实。
Darrel Miller

1
请注意,为了获得最佳性能,您不应该像这样实例化HTTP客户端。您可以在此处阅读有关此内容的更多信息stackoverflow.com/a/15708633/1406930
ScottBurfieldMills

16

如果它可以是所有请求的相同标头,或者在每个请求之后处置客户端,则可以使用以下DefaultRequestHeaders.Add选项:

client.DefaultRequestHeaders.Add("apikey","xxxxxxxxx");      

3
我相信这会将标头添加到该HttpClient以后发送的所有消息中。这与OP的观点相矛盾:“我该如何针对单个请求(而不是在HttpClient上对所有以后的请求)?” HttpClient实例旨在创建一次并使用多次。
Flydog57 '19

要在请求上设置自定义标头,请使用自定义标头构建请求,然后再将其传递给httpclient以发送到http服务器。在httpclient上设置了默认标头,以将每个请求发送到服务器。
Zimba

0

要在请求中设置自定义标头,请使用自定义标头构建一个请求,然后再将其传递给httpclient以发送到http服务器。例如:

HttpClient client = HttpClients.custom().build();
HttpUriRequest request = RequestBuilder.get()
  .setUri(someURL)
  .setHeader(HttpHeaders.CONTENT_TYPE, "application/json")
  .build();
client.execute(request);

默认标头是SET ON HTTPCLIENT,用于将每个请求发送到服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.