HttpClient.GetAsync kullanırken üstbilgi ekleme


167

Bir Windows Mağazası uygulama projesinde Apiary.io ile diğer meslektaşlarım tarafından yapılan bir API uyguluyorum.

Uygulamam gereken bir yöntemin bu örneğini gösteriyorlar:

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

Bu ve diğer bazı yöntemlerde, daha önce aldığım bir token ile başlığa ihtiyacım var.

İşte bahsettiğim başlığa sahip Postman'ın (krom uzantısı) bir resmi: görüntü açıklamasını buraya girin

Bu Yetkilendirme başlığını isteğe nasıl eklerim?



7
Uyarı Potansiyel kod arayanlar için: Bu, HttpClient'in yanlış kullanımıdır !! Aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong nedenini kontrol edin .
321X

Yanıtlar:


187

GetAsync'i HttpClient ile kullanırken, aşağıdaki gibi yetkilendirme başlıklarını ekleyebilirsiniz:

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

Bu, HttpClient'in ömrü boyunca yetkilendirme başlığını ekler, bu nedenle, yetkilendirme başlığının değişmediği bir siteye vuruyorsanız yararlıdır.

İşte ayrıntılı bir SO cevabı


41
-1 çünkü HttpClient yeniden kullanılabilir olmalıdır (bkz. Aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong ). Yeniden kullanılabilir olması gerekiyorsa, varsayılan istek başlıklarını ayarlamak kötü bir uygulamadır.
JCKödel

29
@ JCKödel Yaptığınız yanlış bir varsayım. DefaultRequestHeaders'ı kullanarak HttpClient'in ömrü boyunca aynı siteyi her zaman aynı kimlik bilgileriyle çağırıyorsanız, onları aynı değerlerle sürekli olarak yeniden ayarlamak zorunda kalmazsınız. Aynı HttpClient örneğini kullanmaktan bahsettiği makaleyi yeniden okumalısınız, varsayılan istek başlıklarının kötü bir uygulama olduğu konusunda hiçbir açıklama yapmaz. Eğer HTTP istemcisi ile şimdiye kadar sadece bir siteyi çağırıyorsam, bu pratikte DefaultRequestHeaders'ı kullanmak sizi her seferinde onları ayarlamak zorunda kalmaktan kurtarır.
kmcnamee

@ JCKödel, varsayımınızda yanlış olmanıza rağmen, yorumunuza olumlu oy verdim çünkü önemli bir noktaya değindiniz. Cevaba daha fazla netlik eklendi.
Najeeb

@kmcnamee, ya iki jeton geçirmem gerekirse?
Najeeb

299

Daha sonra bir cevap, ama kimse bu çözümü vermediği için ...

Başlığı HttpClientörneğe ekleyerek ayarlamak istemiyorsanız DefaultRequestHeaders, istek başına üstbilgileri ayarlayabilirsiniz .

Ancak SendAsync()yöntemi kullanmak zorunda kalacaksınız .

Yeniden kullanmak istiyorsanızHttpClient doğru çözüm budur - ki bu,

Bunu şu şekilde kullanın:

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

6
Değer sık ​​sık değişiyorsa DefaultRequestHeaders'ı kullanmamak daha güvenli görünüyor.
Jason Rowe

3
Muhtemelen requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);"Taşıyıcı" na ihtiyacınız olduğuna dikkat edin, geçersiz bir HTTP başlığı olacaktır
Chris Marisic

3
Bunun için teşekkürler, HttpClient'ımızı yeniden kullanıyoruz ve bu bize yardımcı oldu
StevenMcD

2
@JCKodel, kullanmak zorunda olmadığınız için gürültü ekleyebilirdi, ancak kurucuda usingbaşlatabilir veDispose()
Philippe

3
usingHttpClient üzerinde kullanımdan hiç bahsetmedim (bu kötüdür), HttpRequesMessage'da dedim (çünkü kullanımdan sonra atılması ZORUNLU akış için yönetilmeyen bellek tamponları var). İstek ve yanıt, her istek için atılır ve atılmalıdır (aksi takdirde, büyük bellek parçalarını uzun süre kilitli tutarsınız). Bir ölçüde HttpClientyeniden kullanılabilir.
JCKödel

77

Kabul edilen cevap işe yarıyor ancak Kabul başlıklarını eklemeyi denemek istediğimde karmaşıklaşabilir. Bu benim son bulduğum şey. Bana daha basit görünüyor, bu yüzden gelecekte buna bağlı kalacağımı düşünüyorum:

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

1
Temel Yetkilendirme başlığı eklemenin en basit yolu
sandyiit

7

İhtiyacınız olan başlıkları HttpClient.

İşte bununla ilgili güzel bir öğretici .

Bu sadece POST isteklerine atıfta bulunmakla kalmaz, aynı zamanda GET istekleri için de kullanabilirsiniz.


1
Site bağlantısının süresinin dolması durumunda Github url'si .
Sen Jacob

6

Greenhoorn'un cevabının ardından, "Uzantıları" şu şekilde kullanabilirsiniz:

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

Ve kullan:

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

0

Bazen sadece bu koda ihtiyacınız vardır.

 httpClient.DefaultRequestHeaders.Add("token", token);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.