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.