ส่วนหัวที่กำหนดเองสำหรับคำขอ HttpClient


147

ฉันจะเพิ่มส่วนหัวที่กำหนดเองในHttpClientคำขอได้อย่างไร ฉันใช้PostAsJsonAsyncวิธีการโพสต์ JSON ส่วนหัวที่กำหนดเองที่ฉันจะต้องเพิ่มคือ

"X-Version: 1"

นี่คือสิ่งที่ฉันได้ทำไปแล้ว:

using (var client = new HttpClient()) {
    client.BaseAddress = new Uri("https://api.clickatell.com/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "xxxxxxxxxxxxxxxxxxxx");
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var response = client.PostAsJsonAsync("rest/message", svm).Result;
}

3
อาจซ้ำกันของการเพิ่มส่วนหัว Http ไปยัง HttpClient
Liam

@ เลียม: คำถามของฉันคือวิธีเพิ่มส่วนหัวที่กำหนดเอง โดยที่คำถามอื่น ๆ คือวิธีเพิ่มส่วนหัว
Libin Joseph

3
ฉันคิดว่าพบแล้วว่าเราไม่ควรทิ้ง HttpClient aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Don Rolling

คำตอบ:


63
var request = new HttpRequestMessage {
    RequestUri = new Uri("[your request url string]"),
    Method = HttpMethod.Post,
    Headers = {
        { "X-Version", "1" } // HERE IS HOW TO ADD HEADERS,
        { HttpRequestHeader.Authorization.ToString(), "[your authorization token]" },
        { HttpRequestHeader.ContentType.ToString(), "multipart/mixed" },//use this content type if you want to send more than one content type
    },
    Content = new MultipartContent { // Just example of request sending multipart request
        new ObjectContent<[YOUR JSON OBJECT TYPE]>(
            new [YOUR JSON OBJECT TYPE INSTANCE](...){...}, 
            new JsonMediaTypeFormatter(), 
            "application/json"), // this will add 'Content-Type' header for the first part of request
        new ByteArrayContent([BINARY DATA]) {
            Headers = { // this will add headers for the second part of request
                { "Content-Type", "application/Executable" },
                { "Content-Disposition", "form-data; filename=\"test.pdf\"" },
            },
        },
    },
};

46
คำตอบสับสนมาก ... ทำไมคุณถึงนำรหัสสำหรับเอกสาร blank.pdf ฯลฯ สร้างอินสแตนซ์คลาส bytearray เพื่อส่งผ่านส่วนหัวที่กำหนดเองภายใน Content param?
heug

2
@heug ดี หากคุณกำลังมองหาส่วนหัวคุณสามารถดูได้ มีเนื้อหาอยู่ที่นี่เพื่อให้รูปภาพสมบูรณ์เนื่องจากคุณน่าจะต้องการเพิ่มเนื้อหาบางส่วนในคำขอของคุณ และเพื่อไม่ให้น่าเบื่อเนื้อหาจึงมีความซับซ้อนและมีทั้ง JSON และข้อมูลไบนารี
Anubis

2
ดูเหมือนจะตรงกว่าที่จะทำเช่นนี้: สร้าง StringContent โดยใช้ JSON เนื้อหาของคุณสร้างข้อความ HTTP ด้วยวิธีการและ URI ของคุณจากนั้นเพิ่มส่วนหัวเช่น message.Headers.Add ("x": "y") .... จากนั้นส่งผ่านไปยัง var response เช่น "var response = await httpClient.SendAsync (message);"
heug

@heug ฉันจะจำสิ่งนี้สำหรับ furute ขอบคุณ!
Anubis

3
บรรทัดใดในคำตอบที่ยอมรับข้างต้นใช้ส่วนหัวที่ OP ร้องขอ X-Version จริงหรือไม่ เหตุใดจึงถือว่าเป็นคำตอบที่ยอมรับ
รอน

232

ฉันพบคำตอบสำหรับคำถามของฉันแล้ว

client.DefaultRequestHeaders.Add("X-Version","1");

นั่นควรเพิ่มส่วนหัวที่กำหนดเองในคำขอของคุณ


55
ไม่มันไม่ได้ คำตอบนี้ควรได้รับการพิจารณาด้วยความระมัดระวังเนื่องจากส่วนหัวของคำขอเริ่มต้นจะถูกส่งไปพร้อมกับคำขอแต่ละรายการ คุณควรสร้างคำขอของคุณเช่นที่ @Anubis แนะนำ ควรเติมค่า DefaultsRequestHeaders เมื่อคุณสร้าง HttpClient
Ruhrpottpatriot

8
วิธีนี้ใช้ได้ผลเพราะคุณกำลังสร้างอินสแตนซ์ HttpClient ใหม่สำหรับทุกคำขอ นี่ไม่ใช่วิธีที่ควรใช้คลาสนี้: ควรเป็นฟิลด์แบบคงที่ซึ่งใช้ซ้ำสำหรับคำขอทั้งหมดอย่างน้อยที่สุดก็ไปยังจุดสิ้นสุดเดียวกัน ดูเอกสารประกอบและบล็อกโพสต์จำนวนนับไม่ถ้วน จากนั้นตามที่ @Ruhrpottpatriot ชี้ให้เห็นการเปลี่ยนส่วนหัวเริ่มต้นจะส่งผลต่อคำขอทั้งหมด
kamilk

@Ruhrpottpatriot มีอะไรผิดพลาดในการส่งส่วนหัวสำหรับทุกคำขอ?
David Klempfner

1
@ajbeaven ไม่นั่นไม่ใช่สิ่งที่พูด ตัวอย่างที่ด้านบนของหน้าจะแสดงวิธีการหลักของแอปดังนั้นแม้ว่า HttpClient จะถูกกำจัดไป แต่อินสแตนซ์เดียวกันจะถูกใช้ตลอดอายุการใช้งานของแอปพลิเคชันและนั่นเป็นสิ่งที่ถูกต้องเกี่ยวกับสิ่งที่เอกสารระบุเล็กน้อย บิตลงเพิ่มเติม: 'HttpClient มีวัตถุประสงค์ที่จะ instantiated ครั้งและอีกครั้งใช้ตลอดชีวิตของแอพลิเคชัน' ต่อไปนี้ย่อหน้านี้เป็นตัวอย่างที่แนะนำการกำหนด HttpClient ให้กับฟิลด์แบบคงที่
kamilk

1
@kamilk คุณตายถูก - ตัวอย่างนั้นทำให้ฉันผิด ขอบคุณที่ทำให้ฉันถูกต้อง :)
ajbeaven

88

นี่คือคำตอบตามที่ Anubis (ซึ่งเป็นแนวทางที่ดีกว่าเนื่องจากไม่ได้แก้ไขส่วนหัวสำหรับทุกคำขอ) แต่จะเทียบเท่ากับโค้ดในคำถามเดิมมากกว่า:

using Newtonsoft.Json;
...

    var client = new HttpClient();
    var httpRequestMessage = new HttpRequestMessage
        {
            Method = HttpMethod.Post,
            RequestUri = new Uri("https://api.clickatell.com/rest/message"),
            Headers = { 
                { HttpRequestHeader.Authorization.ToString(), "Bearer xxxxxxxxxxxxxxxxxxxx" },
                { HttpRequestHeader.Accept.ToString(), "application/json" },
                { "X-Version", "1" }
            },
            Content = new StringContent(JsonConvert.SerializeObject(svm))
        };

    var response = client.SendAsync(httpRequestMessage).Result;

@RossPresser ไม่แน่นอน Content-Type คือส่วนหัวของเนื้อหา
Panagiotis Kanavos

1
ตกลงนี่คือคำตอบ สาธิตวิธีการเพิ่มส่วนหัวที่ OP ร้องขอ ตอบคำถามของฉันเช่นกัน
รอน

1
FYI ผมคิดว่าควรจะเป็นHttpRequestHeader.Access HttpRequestHeader.Accept
Mass Dot Net

svm คืออะไร?
aswzen

@aswzen มันมาจากคำถามของ OP - แบบจำลองบางอย่างที่ฉันเดาได้ วัตถุที่ถูกทำให้เป็นอนุกรม
Chris Peacock

4

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

หวังว่านี่จะทำให้ทุกอย่างชัดเจนขึ้นอย่างน้อยก็มีคนเห็นคำตอบนี้ในอนาคต


1
ไม่ไม่ได้ทำให้ชัดเจนขึ้น ในทั้งสองกรณีคุณกำลังบอกว่าคุณกำลังส่งส่วนหัวในทุกคำขอ - ความแตกต่างคืออะไร?
joedotnot

4
Headersเป็นคุณสมบัติของแต่ละHttpRequestMessageวัตถุ ดังนั้นคุณสามารถสร้างข้อความที่แตกต่างกันโดยมีส่วนหัวที่แตกต่างกัน DefaultRequestHeadersเป็นคุณสมบัติของHttpClientวัตถุ หากมีการส่งข้อความหลายข้อความผ่านHttpClientข้อความดังกล่าวทั้งหมดจะมีการDefaultRequestHeadersเพิ่มส่วนหัวของแต่ละข้อความเหมือนกัน
Ross Presser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.