Додавання заголовків 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, що йде вперед. Це суперечить точці ОП: "Як зробити це для індивідуального запиту (на відміну від 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);

Заголовок за замовчуванням встановлений НА ВКЛ. HTTPCLIENT для надсилання кожного запиту на сервер.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.