कस्टम हेडर HttpClient अनुरोध करने के लिए


140

मैं कस्टम शीर्षलेख को HttpClientअनुरोध में कैसे जोड़ूँ ? मैं PostAsJsonAsyncJSON पोस्ट करने के लिए विधि का उपयोग कर रहा हूं । मेरे द्वारा जोड़े जाने वाले कस्टम हेडर है

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


@ लियम: मेरा सवाल था कि कस्टम हेडर कैसे जोड़े जाएं। जहाँ दूसरा प्रश्न यह था कि हेडर कैसे जोड़ा जाए
Libin Joseph

2
मुझे लगता है कि यह पाया गया है कि हमें HttpClient का निपटान नहीं करना चाहिए। aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
डॉन

जवाबों:


57
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\"" },
            },
        },
    },
};

38
उत्तर अत्यंत भ्रामक है ... आप दस्तावेज़ों के लिए कोड क्यों ला रहे हैं, blank.pdf, आदि? कंटेंट परम के भीतर कस्टम हेडर पास करने के लिए तत्काल कक्षाओं को तत्काल करना?
हेग

2
@ हग वेल। यदि आप शीर्ष लेख की तलाश कर रहे हैं तो आप इसे देख सकते हैं। चित्र को पूरा करने के लिए सामग्री यहां मौजूद है क्योंकि आप सबसे अधिक संभावना अपने अनुरोध में कुछ सामग्री जोड़ना चाहते हैं। और थकाऊ नहीं होने के लिए सामग्री जटिल है और इसमें JSON और बाइनरी डेटा दोनों शामिल हैं।
Anubis

2
यह सिर्फ इस तरह से करने के लिए अधिक सीधा लगता है: अपनी सामग्री JSON का उपयोग करके StringContent बनाएं, अपनी विधि और URI के साथ एक HTTP संदेश बनाएं, फिर हेडर को संदेश की तरह जोड़ें। Headers.Add ("x": "y" ...)। फिर उन लोगों को एक प्रतिक्रिया संस्करण में पास करें जैसे "var response = प्रतीक्षा httpClient.SendAsync (संदेश);"
हेग

@ हयग मैं इस प्यारे के लिए याद करेंगे। धन्यवाद!
Anubis

3
उपरोक्त स्वीकृत उत्तर में कौन सी लाइन वास्तव में हेडर को लागू करती है जिसे ओपी ने अनुरोध किया है, एक्स-संस्करण? इसे स्वीकृत उत्तर क्यों माना जाता है?
रॉन

215

मुझे अपने प्रश्न का उत्तर मिल गया है।

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

जो आपके अनुरोध पर एक कस्टम हेडर जोड़ना चाहिए


50
नहीं, यह नहीं है। इस जवाब को सावधानी के साथ देखा जाना चाहिए, क्योंकि चूक अनुरोध हेडर प्रत्येक अनुरोध के साथ भेजे जाते हैं। आपको अपने अनुरोध का निर्माण करना चाहिए जैसे @Anubis ने सुझाव दिया है। जब आप HttpClient बनाते हैं तो DefaultsRequestHeaders को पॉप्युलेट किया जाना चाहिए।
रुहरपोट्टिपट्री

6
यह केवल इसलिए काम करता है क्योंकि आप हर अनुरोध के लिए एक नया HttpClient इंस्टेंट कर रहे हैं। इस तरह से इस वर्ग का उपयोग नहीं किया जाना चाहिए: यह एक स्थिर क्षेत्र होना चाहिए, सभी अनुरोधों के लिए पुन: उपयोग किया जाना चाहिए, कम से कम एक ही समापन बिंदु पर। प्रलेखन और अनगिनत ब्लॉग पोस्ट देखें। फिर, जैसा कि @Ruhrpottpatriot बताते हैं, डिफ़ॉल्ट हेडर बदलने से सभी अनुरोध प्रभावित होंगे।
kamilk

@Ruhrpottpatriot हर अनुरोध के लिए हेडर भेजने में क्या गलत है?
डेविड क्लेम्फनर

1
@ नेजेवेन नोप, यह वह नहीं है जो यह कहता है। पृष्ठ के शीर्ष पर दिया गया उदाहरण ऐप की मुख्य विधि दिखाता है, इसलिए भले ही HttpClient का निपटारा कर दिया गया हो, लेकिन आवेदन के पूरे जीवनकाल में एक ही उदाहरण का उपयोग किया जाता है, और यह सही है कि प्रलेखन क्या कहता है थोड़ा और नीचे: 'HttpClient को एक बार इंस्टेंटिएट करने और एक एप्लिकेशन के जीवन भर पुनः उपयोग करने का इरादा है' । इस पैराग्राफ का अनुसरण करना एक उदाहरण है जो HttpClient को स्थिर क्षेत्र में निर्दिष्ट करने की सिफारिश करता है।
kamilk

1
@kamilk, आप सही मर रहे हैं - उस उदाहरण ने मुझे गलत किया। मुझे सही डालने के लिए धन्यवाद :)
ajbeaven

79

यहाँ पर एक उत्तर 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 निश्चित रूप से नहीं। सामग्री-प्रकार एक सामग्री हेडर है।
पनियागोटिस कानावोस

1
इस बात से सहमत हैं। यह दर्शाता है कि ओपी द्वारा अनुरोध किए गए शीर्ष लेख को कैसे जोड़ा जाए। मेरे सवाल का जवाब भी दिया।
रॉन

1
FYI करें मुझे लगता है कि HttpRequestHeader.Accessहोना चाहिए HttpRequestHeader.Accept
मास डॉट नेट

वैसे svm क्या है?
aswzen

@aswzen यह ओपी के सवाल से है - मुझे लगता है कि कुछ मॉडल होगा। वस्तु क्रमबद्ध हो रही है।
क्रिस पीकॉक

2

क्लास Headersमें एक प्रॉपर्टी है HttpRequestMessage। आप वहां कस्टम हेडर जोड़ सकते हैं, जो प्रत्येक HTTP अनुरोध के साथ भेजा जाएगा। DefaultRequestHeadersमें HttpClientकक्षा, दूसरे हाथ पर, सेट है कि ग्राहक वस्तु का उपयोग कर, इसलिए नाम भेजा हेडर प्रत्येक अनुरोध के साथ भेजे जाने के लिए डिफ़ॉल्ट अनुरोध हेडर।

आशा है कि यह चीजों को और अधिक स्पष्ट करता है, कम से कम भविष्य में इस उत्तर को देखने वाले किसी व्यक्ति के लिए।


1
नहीं, इसे कोई स्पष्ट नहीं करता है। दोनों मामलों में आप कह रहे हैं कि आप हर अनुरोध पर हेडर भेज रहे हैं - तो क्या अंतर है?
joedotnot

3
Headersएक व्यक्तिगत HttpRequestMessageवस्तु की एक संपत्ति है । इस प्रकार आप विभिन्न हेडर के साथ विभिन्न संदेश बना सकते हैं। वस्तु DefaultRequestHeadersकी एक संपत्ति है HttpClient; यदि दिए गए के माध्यम से कई संदेश भेजे जाते हैं HttpClient, तो ऐसे सभी संदेश सभी को DefaultRequestHeadersसंदेश के अलग-अलग हेडर में समान जोड़ दिए जाएंगे ।
रॉस प्रेसर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.