Dodawanie nagłówków HTTP do HttpClient


158

Wszystko:

Muszę dodać nagłówki http do HttpClient, zanim wyślę żądanie do usługi sieci Web. Jak to zrobić dla indywidualnego żądania (w przeciwieństwie do HttpClient do wszystkich przyszłych żądań)? Nie jestem pewien, czy jest to w ogóle możliwe.

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();

Odpowiedzi:


245

Utwórz HttpRequestMessage, ustaw metodę na GET, ustaw nagłówki, a następnie użyj SendAsynczamiast 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
Dzięki, Darrel! Byłem rozczarowany, HttpClientdopóki nie zobaczyłem, że możesz to zrobić.
Sam

23
@Talon To znaczy 406. Klient poprosił o typ nośnika, którego serwer nie obsługuje. Jeśli nie obchodzi cię, jaki typ nośnika otrzymasz, nie proś o niego. OP po prostu pytał, jak dodać nagłówki do żądania. Po prostu wybrałem losowy przykład.
Darrel Miller

15
Obecnie prawdopodobnie chcesz var response = await client.SendAsynczamiast ContinueWithitask.Wait()
Michael Parker

1
@MichaelParker Rzeczywiście.
Darrel Miller

1
Należy pamiętać, że w celu uzyskania najlepszej wydajności nie należy tworzyć takiej instancji klienta HTTP. Możesz przeczytać więcej na ten temat tutaj stackoverflow.com/a/15708633/1406930
ScottBurfieldMills

16

Kiedy może to być ten sam nagłówek dla wszystkich żądań lub usuwasz klienta po każdym żądaniu, możesz użyć DefaultRequestHeaders.Addopcji:

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

3
Uważam, że to dodaje nagłówek do wszystkich wiadomości wysyłanych przez tego HttpClient w przyszłości. Jest to sprzeczne z punktem OP: „Jak to zrobić dla indywidualnego żądania (w przeciwieństwie do HttpClient do wszystkich przyszłych żądań)?” Wystąpienia HttpClient są przeznaczone do jednorazowego tworzenia i wielokrotnego używania.
Flydog57

Aby ustawić niestandardowe nagłówki w żądaniu, utwórz żądanie z niestandardowym nagłówkiem przed przekazaniem go do httpclient w celu wysłania na serwer http. Domyślny nagłówek jest ustawiany na httpclient do wysyłania przy każdym żądaniu do serwera.
Zimba

0

Aby ustawić niestandardowe nagłówki NA ŻĄDANIE, utwórz żądanie z niestandardowym nagłówkiem przed przekazaniem go do httpclient w celu wysłania do serwera http. na przykład:

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

Domyślny nagłówek jest ustawiony na HTTPCLIENT, aby wysyłać przy każdym żądaniu do serwera.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.