Aggiunta di intestazioni Http a HttpClient


158

Tutti:

Devo aggiungere le intestazioni http a HttpClient prima di inviare una richiesta a un servizio Web. Come posso farlo per una richiesta individuale (al contrario di su HttpClient a tutte le richieste future)? Non sono sicuro che sia possibile.

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

Risposte:


245

Creare un HttpRequestMessage, impostare il metodo su GET, impostare le intestazioni e quindi utilizzare SendAsyncinvece di 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
Grazie Darrel! Sono rimasto deluso HttpClientfino a quando ho visto che potresti farlo.
Sam,

23
@Talon Ecco cosa significa 406. Il client ha richiesto un tipo di supporto che il server non supporta. Se non ti interessa il tipo di supporto che ottieni, non chiederne uno. L'OP stava semplicemente chiedendo come aggiungere intestazioni a una richiesta. Ho appena scelto un esempio casuale.
Darrel Miller,

15
In questi giorni probabilmente vorrai var response = await client.SendAsyncinvece ContinueWithetask.Wait()
Michael Parker il

1
@MichaelParker Effettivamente.
Darrel Miller,

1
Per prestazioni ottimali, non è necessario creare un'istanza di un client HTTP come questo. Si può leggere di più su questo qui stackoverflow.com/a/15708633/1406930
ScottBurfieldMills

16

Quando può essere la stessa intestazione per tutte le richieste o si dispone il client dopo ogni richiesta, è possibile utilizzare l' DefaultRequestHeaders.Addopzione:

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

3
Credo che ciò aggiunga l'intestazione a tutti i messaggi inviati da quell'HttpClient in futuro. Ciò contraddice il punto del PO: "Come posso farlo per una richiesta individuale (al contrario di su HttpClient a tutte le richieste future)?" Le istanze di HttpClient sono progettate per essere create una volta e utilizzate più volte.
Flydog57,

Per impostare intestazioni personalizzate su una richiesta, crea una richiesta con l'intestazione personalizzata prima di passarla a httpclient per inviarla al server http. L'intestazione predefinita è impostata su httpclient per l'invio di ogni richiesta al server.
Zimba,

0

Per impostare intestazioni personalizzate SU RICHIESTA, creare una richiesta con l'intestazione personalizzata prima di passarla a httpclient per inviarla al server http. per esempio:

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

L'intestazione predefinita è SET ON HTTPCLIENT per inviare ogni richiesta al server.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.