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?

Ric
źródło
2
możliwy duplikat nagłówka autoryzacji ustawienia HttpClient
Daniel Kelley
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

kmcnamee
źródło
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);
}
Philippe
źródło
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);
sirdank
źródło
Najprostszy sposób na dodanie nagłówka Basic Authorization
sandyiit
7

Możesz dodać potrzebne nagłówki do pliku HttpClient.

Oto fajny tutorial na ten temat.

Dotyczy to nie tylko żądań POST, ale także żądań GET.

greenhoorn
źródło
Adres URL Github , na wypadek gdyby link do witryny wygasł.
Sen Jacob
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")
RDyego
źródło
-1

Czasami potrzebujesz tylko tego kodu.

 httpClient.DefaultRequestHeaders.Add("token", token);
Jackdon Wang
źródło