การเพิ่มส่วนหัวเมื่อใช้ httpClient.GetAsync


152

ฉันกำลังใช้ API ที่สร้างโดยเพื่อนร่วมงานคนอื่นกับ Apiary.io ในโครงการแอพ Windows Store

พวกเขาแสดงตัวอย่างของวิธีการที่ฉันต้องใช้:

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

ในนี้และวิธีอื่น ๆ ฉันต้องมีส่วนหัวที่มีโทเค็นที่ฉันได้รับมาก่อน

นี่คือภาพของบุรุษไปรษณีย์ (ส่วนขยายของ Chrome) ที่มีส่วนหัวที่ฉันกำลังพูดถึง: ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะเพิ่มหัวข้อการให้สิทธิ์ลงในคำขอได้อย่างไร



5
คำเตือนสำหรับผู้ค้นหาโค้ดที่อาจเกิดขึ้น: นี่เป็นการใช้งาน HttpClient ไม่ถูกต้อง !! ตรวจสอบaspnetmonsters.com/2016/08/2016-08-27-httpclientwrongทำไม
321X6

คำตอบ:


174

เมื่อใช้ GetAsync กับ HttpClient คุณสามารถเพิ่มส่วนหัวการอนุญาตดังนี้:

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

สิ่งนี้จะเพิ่มส่วนหัวการอนุญาตสำหรับอายุการใช้งานของ HttpClient ดังนั้นจะมีประโยชน์หากคุณกดปุ่มหนึ่งไซต์ที่ส่วนหัวการอนุญาตไม่เปลี่ยนแปลง

นี่คือคำตอบ SO โดยละเอียด


31
-1 เนื่องจากต้องใช้ HttpClient อีกครั้ง (ดูaspnetmonsters.com/2016/08/2016-08-27-httpclientwrong ) ถ้ามันจะต้องสามารถนำมาใช้ซ้ำการตั้งค่าส่วนหัวคำขอเริ่มต้นคือการปฏิบัติที่ไม่ดี
JCKödel

22
@ JCKödelนั่นเป็นข้อสมมุติที่ผิดที่คุณกำลังทำอยู่ หากคุณเรียกไซต์เดียวกันด้วยข้อมูลประจำตัวที่เหมือนกันตลอดอายุการใช้งานของ HttpClient โดยใช้ DefaultRequestHeaders จะช่วยให้คุณไม่ต้องตั้งค่าเหล่านั้นอีกครั้งด้วยค่าเดียวกันอย่างต่อเนื่อง คุณควรอ่านบทความที่กล่าวถึงเกี่ยวกับการใช้อินสแตนซ์เดียวกันของ HttpClient อีกครั้งทำให้ไม่มีคำสั่งใด ๆ เกี่ยวกับส่วนหัวของคำขอเริ่มต้นซึ่งเป็นแนวปฏิบัติที่ไม่ดี ถ้าฉันกำลังเรียกไซต์เดียวกับไคลเอนต์ HTTP ซึ่งในทางปฏิบัติจะเกิดขึ้นโดยใช้ DefaultRequestHeaders ช่วยคุณไม่ให้ตั้งค่าในแต่ละครั้ง
kmcnamee

@ JCKödelแม้ว่าคุณจะไม่ถูกต้องในการสันนิษฐานของคุณฉัน upvoted ความคิดเห็นของคุณเพราะคุณทำให้ประเด็นสำคัญ เพิ่มความชัดเจนให้กับคำตอบมากขึ้น
Najeeb

@ kmcnamee ถ้าฉันต้องผ่านโทเค็นสองอันล่ะ
Najeeb

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 หากค่าเปลี่ยนบ่อย
Jason Rowe

3
หมายเหตุคุณมากอาจจะต้องrequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);"ถือ" จะไม่ถูกต้องส่วนหัว HTTP
คริส Marisic

3
ขอบคุณสำหรับสิ่งนี้เรากำลังนำ HttpClient ของเรากลับมาใช้ใหม่และสิ่งนี้ช่วยเราได้
StevenMcD

2
มัน @JCKodel จะได้เพิ่มเสียงเพราะคุณไม่จำเป็นต้องมีภาระผูกพันที่จะใช้usingแต่อาจยกตัวอย่างในคอนสตรัคและทิ้งในDispose()
ฟิลิปป์

3
ฉันไม่เคยพูดว่าใช้งานusingบน HttpClient (อันนี้ไม่ดี) ฉันพูดกับ HttpRequesMessage (เพราะมีบัฟเฟอร์หน่วยความจำที่ไม่มีการจัดการสำหรับการสตรีมที่ต้องกำจัดหลังการใช้งาน) การร้องขอและการตอบสนองคือและจะต้องกำจัดทุกคำขอ (มิฉะนั้นคุณจะเก็บชิ้นส่วนหน่วยความจำขนาดใหญ่ล็อคเป็นเวลานาน) The HttpClientสามารถนำกลับมาใช้ใหม่เพื่อขยาย
JCKödel

70

คำตอบที่ยอมรับใช้งานได้ แต่อาจมีความซับซ้อนเมื่อฉันต้องการลองเพิ่มส่วนหัวยอมรับ นี่คือสิ่งที่ฉันลงเอยด้วย ดูเหมือนง่ายสำหรับฉันดังนั้นฉันคิดว่าฉันจะติดกับมันในอนาคต:

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

วิธีที่ง่ายที่สุดในการเพิ่มส่วนหัวการอนุมัติพื้นฐาน
sandyiit

7

HttpClientคุณสามารถเพิ่มส่วนหัวของสิ่งที่คุณต้องการไป

นี่คือการสอนที่ดีเกี่ยวกับเรื่องนี้

สิ่งนี้ไม่เพียงอ้างอิงถึงคำขอ POST เท่านั้นคุณยังสามารถใช้กับคำขอ GET ได้อีกด้วย


GitHub URLในกรณีที่ลิงค์เว็บไซต์หมดอายุ
Sen Jacob

4

ทำตามคำตอบของ greenhoorn คุณสามารถใช้ "ส่วนขยาย" แบบนี้:

  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.