Hinzufügen von Headern bei Verwendung von httpClient.GetAsync

150

Ich implementiere eine API, die von anderen Kollegen mit Apiary.io erstellt wurde, in einem Windows Store-App-Projekt.

Sie zeigen dieses Beispiel einer Methode, die ich implementieren muss:

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

Bei dieser und einigen anderen Methoden muss ein Header mit einem Token vorhanden sein, das ich zuvor erhalten habe.

Hier ist ein Bild von Postman (Chrome-Erweiterung) mit dem Header, über den ich spreche: Geben Sie hier die Bildbeschreibung ein

Wie füge ich diesen Autorisierungsheader zur Anforderung hinzu?

Ric
quelle
2
Mögliches Duplikat der Einstellung Autorisierungsheader von HttpClient
Daniel Kelley
5
Warnung Für potenzielle Codesucher: Dies ist eine falsche Verwendung von HttpClient !! Überprüfen Sie aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong warum.
321X

Antworten:

173

Wenn Sie GetAsync mit dem HttpClient verwenden, können Sie die Autorisierungsheader wie folgt hinzufügen:

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

Dadurch wird der Autorisierungsheader für die Lebensdauer des HttpClient hinzugefügt. Dies ist hilfreich, wenn Sie auf eine Site stoßen, an der sich der Autorisierungsheader nicht ändert.

Hier ist eine detaillierte SO- Antwort

kmcnamee
quelle
31
-1, da HttpClient wiederverwendbar sein muss (siehe aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong ). Wenn es wiederverwendbar sein muss, ist das Festlegen der Standardanforderungsheader eine schlechte Praxis.
JCKödel
22
@ JCKödel Das ist eine falsche Annahme, die Sie machen. Wenn Sie mit den DefaultRequestHeaders immer dieselbe Site mit denselben Anmeldeinformationen für die Lebensdauer des HttpClient aufrufen, müssen Sie diese nicht ständig mit denselben Werten erneut festlegen. Sie sollten den Artikel, in dem es um die Verwendung derselben Instanz des HttpClient geht, erneut lesen. Es werden keine Aussagen darüber gemacht, dass Standardanforderungsheader eine schlechte Praxis sind. Wenn ich jemals nur eine Site mit dem HTTP-Client anrufe, was in der Praxis mit den DefaultRequestHeaders geschieht, müssen Sie diese nicht jedes Mal festlegen.
kmcnamee
@ JCKödel, obwohl Sie in Ihrer Annahme falsch sind, habe ich Ihren Kommentar positiv bewertet, weil Sie einen wichtigen Punkt angesprochen haben. Die Antwort wurde klarer.
Najeeb
@kmcnamee, was ist, wenn ich zwei Token übergeben muss?
Najeeb
279

Eine spätere Antwort, aber weil niemand diese Lösung gab ...

Wenn Sie den Header für die HttpClientInstanz nicht festlegen möchten, indem Sie ihn zu hinzufügen DefaultRequestHeaders, können Sie Header pro Anforderung festlegen .

Sie sind jedoch verpflichtet, die SendAsync()Methode anzuwenden .

Dies ist die richtige Lösung, wenn Sie das wiederverwenden möchtenHttpClient - eine gute Vorgehensweise für

Verwenden Sie es so:

using (var requestMessage =
            new HttpRequestMessage(HttpMethod.Get, "https://your.site.com"))
{
    requestMessage.Headers.Authorization =
        new AuthenticationHeaderValue("Bearer", your_token);
    httpClient.SendAsync(requestMessage);
}
Philippe
quelle
5
Es scheint sicherer, DefaultRequestHeaders nicht zu verwenden, wenn sich der Wert häufig ändert.
Jason Rowe
3
Beachten Sie, dass Sie sehr wahrscheinlich requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);"Bearer" benötigen, um einen ungültigen HTTP-Header zu erhalten
Chris Marisic
3
Vielen Dank dafür, wir verwenden unseren HttpClient wieder und dies hat uns geholfen
StevenMcD
2
@JCKodel es hätte Rauschen hinzugefügt, weil Sie nicht unbedingt verpflichtet sind, zu verwenden, usingaber im Konstruktor instanziieren und in derDispose()
Philippe
3
Ich habe nie die Verwendung usingauf HttpClient gesagt (dies ist schlecht), ich habe auf HttpRequesMessage gesagt (weil es nicht verwaltete Speicherpuffer für das Streaming gibt, die nach der Verwendung entsorgt werden MÜSSEN). Die Anforderung und Antwort sind und müssen bei jeder Anforderung entsorgt werden (andernfalls bleiben große Speicherblöcke für eine lange Zeit gesperrt). Das HttpClientist bis zu einem gewissen Grad wiederverwendbar.
JCKödel
70

Die akzeptierte Antwort funktioniert, kann aber kompliziert werden, wenn ich versuchen wollte, Accept-Header hinzuzufügen. Damit bin ich gelandet. Es scheint mir einfacher zu sein, also denke ich, dass ich in Zukunft dabei bleiben werde:

client.DefaultRequestHeaders.Add("Accept", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);
Sirdank
quelle
Einfachste Möglichkeit, den Header für die
Basisautorisierung
7

Sie können dem Header alle benötigten Header hinzufügen HttpClient.

Hier ist ein schönes Tutorial dazu.

Dies bezieht sich nicht nur auf POST-Anfragen, sondern kann auch für GET-Anfragen verwendet werden.

Greenhoorn
quelle
Github-URL , falls der Site-Link abgelaufen ist.
Sen Jacob
4

Nach der Antwort des Greenhoorns können Sie "Erweiterungen" wie folgt verwenden:

  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;
        }
    }

Und benutze:

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

Manchmal benötigen Sie nur diesen Code.

 httpClient.DefaultRequestHeaders.Add("token", token);
Jackdon Wang
quelle