HttpClient.GetAsync का उपयोग करते समय हेडर जोड़ना


152

मैं एक सहकर्मी को Apiary.io के साथ विंडोज स्टोर ऐप परियोजना में अन्य सहयोगियों द्वारा बनाया गया एक एपीआई लागू कर रहा हूं।

वे इस पद्धति का एक उदाहरण दिखाते हैं जिसे मुझे लागू करना है:

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

इस और कुछ अन्य तरीकों में, मुझे एक टोकन के साथ एक हेडर होना चाहिए जो मुझे पहले मिले।

यहाँ मैं जिस हेडर की बात कर रहा हूँ उसके साथ पोस्टमैन (क्रोम एक्सटेंशन) की एक छवि है: यहाँ छवि विवरण दर्ज करें

मैं उस प्राधिकरण शीर्षक को अनुरोध में कैसे जोड़ूँ?



5
संभावित कोड खोजकर्ताओं के लिए चेतावनी : यह HttpClient का गलत उपयोग है !! Aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong क्यों की जाँच करें ।
321X

जवाबों:


174

HttpClient के साथ GetAsync का उपयोग करते समय आप प्राधिकरण हेडर को इस तरह जोड़ सकते हैं:

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

यह HttpClient के जीवनकाल के लिए प्राधिकरण शीर्षलेख को जोड़ता है तो उपयोगी है यदि आप एक साइट को मार रहे हैं जहां प्राधिकरण शीर्ष लेख को बदलना चाहिए।

यहां एक विस्तृत SO उत्तर दिया गया है


31
-1 क्योंकि HttpClient पुन: प्रयोज्य होना चाहिए (देखें aspnetmonsters.com/2016/08/2016-08-27-httpclientwriter )। यदि यह पुन: प्रयोज्य होना चाहिए, तो डिफ़ॉल्ट अनुरोध हेडर सेट करना एक बुरा अभ्यास है।
JCKödel

22
@ JCKödel यह एक गलत धारणा है जो आप बना रहे हैं। यदि आप हमेशा उसी साइट को उसी क्रेडेंशियल के साथ कॉल कर रहे हैं जो कि HttpClient के जीवनकाल के लिए DefaultRequestHeaders का उपयोग करके आपको उसी मूल्यों के साथ उन्हें फिर से सेट करने के लिए लगातार बचाता है। आपको उस लेख को फिर से पढ़ना चाहिए जो HttpClient के एक ही उदाहरण का उपयोग करने के बारे में बात करता है, यह डिफ़ॉल्ट अनुरोध हेडर के बारे में कोई बयान नहीं देता है जो खराब अभ्यास है। अगर मैं HTTP क्लाइंट के साथ कभी केवल एक साइट पर कॉल कर रहा हूं, जो कि DefaultRequestHeaders के उपयोग से होता है, तो आपको हर बार उन्हें सेट करने से बचाता है।
kmcnamee

@ JCKödel, हालांकि आप अपनी धारणा में गलत हैं, मैंने आपकी टिप्पणी को गलत ठहराया है, क्योंकि आप एक महत्वपूर्ण बिंदु लाए हैं। उत्तर के लिए अधिक स्पष्टता जोड़ी गई।
नजीब

@kmcnamee, क्या होगा अगर मुझे दो टोकन पास करने की आवश्यकता है?
नजीब

281

बाद में जवाब दिया गया, लेकिन क्योंकि किसी ने यह समाधान नहीं दिया ...

यदि आप शीर्ष लेख को HttpClientइसे जोड़कर इंस्टेंस पर सेट नहीं करना चाहते हैं DefaultRequestHeaders, तो आप प्रति अनुरोध हेडर सेट कर सकते हैं

लेकिन आप SendAsync()विधि का उपयोग करने के लिए बाध्य होंगे ।

यदि आप पुनः प्रयोग करना चाहतेHttpClient हैं, तो यह सही समाधान है - जो कि एक अच्छा अभ्यास है

इसे इस तरह उपयोग करें:

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

5
यदि मान बार-बार बदलता है, तो DefaultRequestHeaders का उपयोग नहीं करने लगता है।
जेसन रोवे

3
ध्यान दें कि आपको requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);"
बीयरर

3
इसके लिए धन्यवाद, हम अपने HttpClient का पुन: उपयोग कर रहे हैं और इससे हमें मदद मिली
StevenMcD

2
@JCKodel ने शोर मचाया होगा क्योंकि आप उपयोग करने के लिए आवश्यक नहीं हैं, usingलेकिन कंस्ट्रक्टर में तुरंत उपयोग कर सकते हैं और निपटान कर सकते हैंDispose()
फिलिप

3
मैंने कभी भी usingHttpClient (यह खराब है) पर उपयोग करने के लिए कहा , मैंने HttpRequesMessage पर कहा (क्योंकि यह स्ट्रीमिंग के लिए अप्रबंधित मेमोरी बफ़र्स है जो उपयोग के बाद निपटाया जाना चाहिए)। अनुरोध और प्रतिक्रिया हर अनुरोध को निपटाया जाना चाहिए (अन्यथा आप बड़ी मेमोरी चंक्स को लंबे समय तक बंद रखेंगे)। HttpClientएक विस्तार करने के लिए पुन: प्रयोज्य,।
JCKödel

70

स्वीकृत उत्तर काम करता है, लेकिन जटिल हो सकता है जब मैं स्वीकार्य हेडर जोड़ने की कोशिश करना चाहता था। यह वही है जिसके साथ मैं समाप्त हुआ। यह मुझे सरल लगता है इसलिए मुझे लगता है कि मैं भविष्य में इसके साथ रहूँगा:

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

बेसिक ऑथराइजेशन हेडर को जोड़ने का सबसे सरल तरीका
सैंडिएनाइट

7

आपको जो भी हेडर चाहिए, आप उसमें जोड़ सकते हैं HttpClient

यहाँ इसके बारे में एक अच्छा ट्यूटोरियल है।

यह केवल POST- अनुरोधों के संदर्भ में नहीं है, आप इसे GET- अनुरोधों के लिए भी उपयोग कर सकते हैं।


साइट लिंक की समय-सीमा समाप्त होने पर, Github url
सेन जैकब

4

ग्रीनहॉर्न के उत्तर के बाद, आप "एक्सटेंशन" का उपयोग इस तरह कर सकते हैं:

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

और उपयोग करें:

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

-1

कभी-कभी, आपको केवल इस कोड की आवश्यकता होती है।

 httpClient.DefaultRequestHeaders.Add("token", token);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.