Aggiunta di intestazioni quando si utilizza httpClient.GetAsync


152

Sto implementando un'API creata da altri colleghi con Apiary.io, in un progetto di app di Windows Store.

Mostrano questo esempio di un metodo che devo implementare:

var baseAddress = new Uri("https://private-a8014-xxxxxx.apiary-mock.com/");

using (var httpClient = new HttpClient{ BaseAddress = baseAddress })
{
    using (var response = await httpClient.GetAsync("user/list{?organizationId}"))
    {
        string responseData = await response.Content.ReadAsStringAsync();
    }
}

In questo e in altri metodi, devo avere un'intestazione con un token che ottengo prima.

Ecco un'immagine di Postman (estensione di Chrome) con l'intestazione di cui sto parlando: inserisci qui la descrizione dell'immagine

Come posso aggiungere quell'intestazione di autorizzazione alla richiesta?



5
Avviso Per potenziali ricercatori di codice: questo è un uso errato di HttpClient !! Controlla aspnetmonsters.com/2016/08/2016 08-08-27-httpclientwrong perché.
321X

Risposte:


174

Quando si utilizza GetAsync con HttpClient è possibile aggiungere le intestazioni di autorizzazione in questo modo:

httpClient.DefaultRequestHeaders.Authorization 
                         = new AuthenticationHeaderValue("Bearer", "Your Oauth token");

Ciò aggiunge l'intestazione dell'autorizzazione per la durata di HttpClient, quindi è utile se si colpisce un sito in cui l'intestazione dell'autorizzazione non cambia.

Ecco una risposta SO dettagliata


31
-1 perché HttpClient deve essere riutilizzabile (consultare aspnetmonsters.com/2016/08/2016 08-08-27 - httpclientwrong ). Se deve essere riutilizzabile, l'impostazione delle intestazioni di richiesta predefinite è una pratica errata.
JCKödel,

23
@ JCKödel È un falso presupposto che stai facendo. Se si chiama sempre lo stesso sito con le stesse credenziali per la durata di HttpClient utilizzando DefaultRequestHeaders, si evita di doverle reimpostare continuamente con gli stessi valori. Dovresti rileggere l'articolo di cui parla sull'uso della stessa istanza di HttpClient, non fa dichiarazioni sul fatto che le intestazioni di richiesta predefinite siano una cattiva pratica. Se chiamo solo un sito in assoluto con il client HTTP che in pratica accade utilizzando DefaultRequestHeaders ti evita di doverli impostare ogni volta.
kmcnamee,

@ JCKödel, anche se non sei corretto nel tuo presupposto, ho annullato il tuo commento, perché hai sollevato un punto importante. Aggiunta maggiore chiarezza alla risposta.
Najeeb,

@kmcnamee, cosa succede se devo passare due token?
Najeeb,

281

Una risposta successiva, ma perché nessuno ha dato questa soluzione ...

Se non si desidera impostare l'intestazione HttpClientsull'istanza aggiungendola a DefaultRequestHeaders, è possibile impostare le intestazioni per richiesta .

Ma sarai obbligato a usare il SendAsync()metodo.

Questa è la soluzione giusta se si desidera riutilizzare ilHttpClient - che è una buona pratica per

Usalo in questo modo:

using (var requestMessage =
            new HttpRequestMessage(HttpMethod.Get, "https://your.site.com"))
{
    requestMessage.Headers.Authorization =
        new AuthenticationHeaderValue("Bearer", your_token);
    httpClient.SendAsync(requestMessage);
}

5
Sembra più sicuro non usare DefaultRequestHeaders se il valore cambia frequentemente.
Jason Rowe,

3
Nota che molto probabilmente hai bisogno di requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);"Bearer" sarebbe un'intestazione HTTP non valida
Chris Marisic,

3
Grazie per questo, stiamo riutilizzando il nostro HttpClient e questo ci ha aiutato
StevenMcD

2
@JCKodel avrebbe aggiunto rumore perché non sei obbligato a usarlo usingma potresti creare un'istanza nel costruttore e smaltire nelDispose()
Philippe

3
Non ho mai detto l'uso usingsu HttpClient (questo è male), ho detto su HttpRequesMessage (perché ha buffer di memoria non gestiti per lo streaming che DEVONO essere eliminati dopo l'uso). La richiesta e la risposta sono e devono essere eliminate per ogni richiesta (altrimenti si manterranno blocchi di memoria di grandi dimensioni bloccati per lungo tempo). Il HttpClientè riutilizzabile, ad estendere.
JCKödel,

70

La risposta accettata funziona ma può essere complicata quando volevo provare ad aggiungere le intestazioni Accept. Questo è quello che ho finito. Mi sembra più semplice, quindi penso che mi atterrò in futuro:

client.DefaultRequestHeaders.Add("Accept", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);

Il modo più semplice per aggiungere l'intestazione dell'autorizzazione di base
sandyiit il

7

Puoi aggiungere le intestazioni di cui hai bisogno al HttpClient.

Ecco un bel tutorial a riguardo.

Questo non si riferisce solo alle richieste POST, ma è anche possibile utilizzarlo per le richieste GET.


URL di Github , nel caso in cui il link al sito sia scaduto.
Sen Jacob

5

Seguendo la risposta del greenhoorn, puoi usare "Estensioni" in questo modo:

  public static class HttpClientExtensions
    {
        public static HttpClient AddTokenToHeader(this HttpClient cl, string token)
        {
            //int timeoutSec = 90;
            //cl.Timeout = new TimeSpan(0, 0, timeoutSec);
            string contentType = "application/json";
            cl.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(contentType));
            cl.DefaultRequestHeaders.Add("Authorization", String.Format("Bearer {0}", token));
            var userAgent = "d-fens HttpClient";
            cl.DefaultRequestHeaders.Add("User-Agent", userAgent);
            return cl;
        }
    }

E usa:

string _tokenUpdated = "TOKEN";
HttpClient _client;
_client.AddTokenToHeader(_tokenUpdated).GetAsync("/api/values")

-1

A volte, hai solo bisogno di questo codice.

 httpClient.DefaultRequestHeaders.Add("token", token);
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.