Добавление заголовков Http в HttpClient

158

Все:

Мне нужно добавить заголовки 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();
Райан Джеймс
источник

Ответы:

245

Создайте HttpRequestMessage, установите метод на 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пока не увидел, что ты можешь сделать это.
Сэм
23
@Talon Вот что значит 406. Клиент запросил тип носителя, который сервер не поддерживает. Если вам все равно, какой тип носителя вы получите, не спрашивайте его. ОП просто спрашивал, как добавить заголовки к запросу. Я просто выбрал случайный пример.
Даррел Миллер
15
В эти дни вы, вероятно, хотите var response = await client.SendAsyncвместо ContinueWithиtask.Wait()
Майкл Паркер
1
@MichaelParker Действительно.
Даррел Миллер
1
Обратите внимание, для лучшей производительности вы не должны создавать такой HTTP-клиент. Вы можете прочитать больше об этом здесь stackoverflow.com/a/15708633/1406930
ScottBurfieldMills
16

Когда это может быть один и тот же заголовок для всех запросов или вы распоряжаетесь клиентом после каждого запроса, вы можете использовать DefaultRequestHeaders.Addопцию:

client.DefaultRequestHeaders.Add("apikey","xxxxxxxxx");      
Таран
источник
3
Я считаю, что это добавляет заголовок ко всем сообщениям, отправляемым этим HttpClient в будущем. Это противоречит точке зрения OP: «Как мне сделать это для отдельного запроса (в отличие от HttpClient для всех будущих запросов)?» Экземпляры HttpClient предназначены для создания один раз и многократного использования.
Flydog57
Чтобы установить пользовательские заголовки для запроса, создайте запрос с пользовательским заголовком, прежде чем передавать его httpclient для отправки на http-сервер. Заголовок по умолчанию установлен на httpclient для отправки при каждом запросе к серверу.
Зимба
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 для отправки при каждом запросе к серверу.

Zimba
источник