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();
Ryan James
źródło

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();
Darrel Miller
źródło
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");      
Taran
źródło
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.

Zimba
źródło