Dodawanie nagłówków podczas korzystania z httpClient.GetAsync


152

Wdrażam interfejs API stworzony przez innych współpracowników z Apiary.io w projekcie aplikacji Windows Store.

Pokazują przykład metody, którą muszę zaimplementować:

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

W tej i kilku innych metodach potrzebuję nagłówka z tokenem, który otrzymałem wcześniej.

Oto obraz Postman (rozszerzenie do Chrome) z nagłówkiem, o którym mówię: wprowadź opis obrazu tutaj

Jak dodać ten nagłówek autoryzacji do żądania?



5
Ostrzeżenie Dla potencjalnych poszukiwaczy kodu: jest to nieprawidłowe użycie HttpClient !! Sprawdź aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong dlaczego.
321X,

Odpowiedzi:


174

Korzystając z GetAsync z HttpClient, możesz dodać nagłówki autoryzacji w następujący sposób:

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

Spowoduje to dodanie nagłówka autoryzacji przez cały okres istnienia HttpClient, więc jest przydatny, jeśli trafisz na jedną witrynę, w której nagłówek autoryzacji nie ulega zmianie.

Oto szczegółowa odpowiedź SO


31
-1, ponieważ HttpClient musi być wielokrotnego użytku (zobacz aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong ). Jeśli musi być wielokrotnego użytku, ustawienie domyślnych nagłówków żądań jest złą praktyką.
JCKödel

22
@ JCKödel To fałszywe założenie, które robisz. Jeśli zawsze wywołujesz tę samą witrynę z tymi samymi poświadczeniami przez cały okres istnienia HttpClient przy użyciu DefaultRequestHeaders, oszczędzasz konieczności ciągłego ustawiania ich ponownie z tymi samymi wartościami. Powinieneś ponownie przeczytać ten artykuł, w którym mowa o używaniu tego samego wystąpienia HttpClient, nie zawiera on żadnych stwierdzeń, że domyślne nagłówki żądań są złą praktyką. Jeśli dzwonię tylko do jednej witryny z klientem HTTP, co w praktyce ma miejsce przy użyciu DefaultRequestHeaders, oszczędza ci konieczności ustawiania ich za każdym razem.
kmcnamee

@ JCKödel, chociaż mylisz się w swoim założeniu, głosowałem za Twoim komentarzem, ponieważ poruszyłeś ważną kwestię. Dodano większą jasność odpowiedzi.
Najeeb

@kmcnamee, co jeśli muszę przekazać dwa tokeny?
Najeeb

281

Później odpowiedź, ale ponieważ nikt nie dał takiego rozwiązania ...

Jeśli nie chcesz ustawiać nagłówka w HttpClientinstancji, dodając go do pliku DefaultRequestHeaders, możesz ustawić nagłówki na żądanie .

Ale będziesz musiał użyć tej SendAsync()metody.

To właściwe rozwiązanie, jeśli chcesz ponownie użyćHttpClient - co jest dobrą praktyką

Użyj tego w ten sposób:

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

5
Wydaje się bezpieczniejsze, aby nie używać DefaultRequestHeaders, jeśli wartość zmienia się często.
Jason Rowe,

3
Zauważ, że najprawdopodobniej potrzebujesz requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);„Bearer” to nieprawidłowy nagłówek HTTP
Chris Marisic,

3
Dzięki za to, ponownie używamy naszego HttpClient i to nam pomogło
StevenMcD

2
@JCKodel dodałoby to szum, ponieważ nie jesteś zobowiązany do użycia, usingale możesz utworzyć wystąpienie w konstruktorze i usunąć wDispose()
Philippe

3
Nigdy nie powiedziałem, że używaj usingna HttpClient (to jest złe), powiedziałem na HttpRequesMessage (ponieważ ma niezarządzane bufory pamięci do przesyłania strumieniowego, które MUSZĄ zostać usunięte po użyciu). Żądanie i odpowiedź są i muszą być usuwane z każdym żądaniem (w przeciwnym razie duże fragmenty pamięci będą blokowane przez długi czas). W HttpClientznacznym stopniu nadaje się do wielokrotnego użytku.
JCKödel

70

Zaakceptowana odpowiedź działa, ale może się skomplikować, gdy chciałem spróbować dodać nagłówki Akceptuj. Na tym skończyłem. Wydaje mi się to prostsze, więc myślę, że pozostanę przy tym w przyszłości:

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

Najprostszy sposób na dodanie nagłówka Basic Authorization
sandyiit


4

Idąc za odpowiedzią greenhoorna, możesz użyć „Rozszerzeń” w następujący sposób:

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

I użyć:

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

-1

Czasami potrzebujesz tylko tego kodu.

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