HttpClient.GetAsync ব্যবহার করার সময় শিরোনাম যুক্ত করা হচ্ছে


152

আমি উইন্ডোজ স্টোর অ্যাপ্লিকেশন প্রকল্পে এপিরি.আইও সহ অন্য সহকর্মীদের দ্বারা তৈরি একটি এপিআই বাস্তবায়ন করছি।

আমাকে প্রয়োগ করতে হবে এমন একটি পদ্ধতির এই উদাহরণটি তারা দেখায়:

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
সম্ভাব্য কোড সন্ধানকারীদের জন্য সতর্কতা : এটি এইচটিপিপ্লিয়েন্টের একটি ভুল ব্যবহার! Aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong কেন পরীক্ষা করুন ।
321 এক্স

উত্তর:


174

এইচটিটিপিপ্লায়েন্টের সাথে গেটএন্সিঙ্ক ব্যবহার করার সময় আপনি এর মতো অনুমোদনের শিরোনাম যুক্ত করতে পারেন:

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

এটি এইচটিটিপিপ্লিনেন্টের আজীবন অনুমোদনের শিরোনামকে যুক্ত করে তাই আপনি যদি এমন কোনও সাইটকে হিট করছেন যেখানে অনুমোদনের শিরোনামটি পরিবর্তন হয় না।

এখানে একটি বিস্তারিত এসও উত্তর দেওয়া হয়েছে


31
-1 কারণ এইচটিপিপি্লায়েন্ট অবশ্যই পুনঃব্যবহারযোগ্য হতে হবে (দেখুন aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong )। যদি এটি অবশ্যই পুনরায় ব্যবহারযোগ্য হয় তবে ডিফল্ট অনুরোধ শিরোনামগুলি সেট করা একটি খারাপ অভ্যাস।
জেসিকেডেল

22
@ জেসি কেডেল এটি একটি ভ্রান্ত অনুমান যা আপনি করছেন। আপনি যদি সর্বদা এইচটিটিপিপ্লিনেন্টের আজীবন জন্য একই শংসাপত্রের সাথে একই সাইটটিকে ডিফল্টরেকুয়েস্টহাইডার্স ব্যবহার করে কল করে থাকেন তবে সেগুলি আবার একই মানগুলির সাথে আবার সেট করা থেকে বাঁচায়। আপনি এই নিবন্ধটি পুনরায় পড়তে হবে এটি এটি এইচটিটিপিপ্লিনেন্টের একই উদাহরণটি ব্যবহার করার বিষয়ে কথা বলে, এটি ডিফল্ট অনুরোধ শিরোনাম খারাপ অনুশীলন সম্পর্কে কোনও বিবৃতি দেয় না। আমি যদি কখনও এইচটিটিপি ক্লায়েন্টের সাথে কেবল একটি সাইট কল করি যা ব্যবহারিকভাবে ডিফল্টরয়েস্টহাইডার্স ব্যবহার করে ঘটে থাকে তবে প্রতিবার সেগুলি সেট করতে আপনাকে বাঁচায়।
কিমিউকেমেনে

@ জেসি কেডেল, যদিও আপনি আপনার অনুমানের ক্ষেত্রে ভুল রয়েছেন, আমি আপনার মন্তব্যটিকে সমর্থন করেছি, কারণ আপনি একটি গুরুত্বপূর্ণ বিষয় তুলে ধরেছেন। উত্তরে আরও স্পষ্টতা যুক্ত হয়েছে।
নাজিব

@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
মানটি ঘন ঘন পরিবর্তিত হলে DefaultRequestHeedia ব্যবহার না করা নিরাপদ বলে মনে হচ্ছে।
জেসন রোয়ে

3
মনে রাখবেন আপনার খুব সম্ভবত requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);"বেয়ারার" দরকার একটি অবৈধ এইচটিটিপি শিরোনাম হবে
ক্রিস মেরিসিক

3
এর জন্য ধন্যবাদ, আমরা আমাদের এইচটিপিপ্লেইয়েন্টটিকে পুনরায় ব্যবহার করছি এবং এটি আমাদের সহায়তা করেছে
স্টিভেন এমসিডি

2
@ জে.সি. কোডেল এটির শব্দ যোগ করত কারণ আপনি ব্যবহার করতে বাধ্য নন usingতবে কনস্ট্রাক্টারে ইনস্ট্যান্টিয়েট করতে পারবেন এবং নিষ্পত্তি করতে পারবেনDispose()
ফিলিপ

3
আমি কখনই usingএইচটিপিপ্লিয়েন্টে ব্যবহার করার কথা বলি না (এটি খারাপ), আমি এইচটিটিপিআরেক্সমেসেজ (কারণ এটির স্ট্রিমিংয়ের জন্য নিয়ন্ত্রণহীন মেমরি বাফার রয়েছে যা ব্যবহারের পরে নিষ্পত্তি করা উচিত) said অনুরোধ এবং প্রতিক্রিয়া হ'ল এবং অবশ্যই প্রতিটি অনুরোধ নিষ্পত্তি করা উচিত (অন্যথায় আপনি বড় মেমরি খণ্ড দীর্ঘ সময়ের জন্য লক করে রাখবেন)। HttpClientএকটি প্রসারিত করতে পুনর্ব্যবহারযোগ্য হয়।
জেসিকেডেল

70

গৃহীত উত্তরটি কাজ করে তবে যখন আমি গ্রহণ শিরোনামগুলি যুক্ত করার চেষ্টা করতে চেয়েছিলাম তখন জটিল হয়ে উঠতে পারে। এটিই আমি শেষ করেছি। এটি আমার কাছে সহজ বলে মনে হচ্ছে তাই আমি মনে করি ভবিষ্যতে এটির সাথে আঁকড়ে থাকব:

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

বেসিক অনুমোদনের শিরোনাম যুক্ত করার সহজ উপায়
স্যান্ডায়িত

7

আপনার যা প্রয়োজন শিরোনাম যুক্ত করতে পারেন HttpClient

এখানে একটি সুন্দর টিউটোরিয়ালএটি সম্পর্কে ।

এটি কেবল পোষ্ট-অনুরোধগুলির উল্লেখ নয়, আপনি এটি জিইটি-অনুরোধগুলির জন্যও ব্যবহার করতে পারেন।


গিথুব 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")

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.