HttpClient के माध्यम से REST API पर एक खाली निकाय पोस्ट करें


119

मैं जिस API को कॉल करने का प्रयास कर रहा हूं, उसके लिए आवश्यक है कि मैं एक POST करूं लेकिन एक खाली निकाय के साथ। मैं WCF वेब एपीआई HttpClient का उपयोग करने के लिए नया हूं और मुझे उस लिखने वाले कोड का पता नहीं लग सकता है जो एक खाली शरीर के साथ एक पोस्ट करेगा। मुझे कुछ HttpContent.CreateEmpty () विधि के संदर्भ मिलते हैं, लेकिन मुझे नहीं लगता कि यह वेब API HttpClient कोड के लिए है क्योंकि मुझे वह तरीका नहीं मिल रहा है।


HttpContent.CreateEmpty पुराने HttpClient प्रोटोटाइप से था जो REST क्वार्टर किट का हिस्सा था। दुर्भाग्य से नए HttpClient में कोई समकक्ष नहीं है।
डारेल मिलर


1
@ मिचेलफ्रीजिम यदि अंतरिक्ष समय के निरंतरता में एक छेद था और किसी तरह 2013 2011 से पहले आया था, तो हाँ यह एक संभव डुप्लिकेट है।
रयान रिनाल्डी

1
"संभावित डुप्लिकेट" सफाई का एक तरीका है - समान प्रश्नों को बंद करने और सबसे अच्छे उत्तरों के साथ एक रखने के लिए। तारीख जरूरी नहीं है। Meta.stackexchange.com/questions/147643/… देखें यदि आप सहमत हैं कि इसके लिए स्पष्टीकरण की आवश्यकता है, तो कृपया meta.stackexchange.com/questions/281980/…
माइकल फ्रीजिम

जवाबों:


119

का उपयोग करें StringContentया ObjectContentजो से प्राप्त HttpContentया आप के nullरूप में उपयोग कर सकते हैं HttpContent:

var response = await client.PostAsync(requestUri, null);


ऐसा लगता है कि यह केवल .NET फ्रेमवर्क 4.5 में है? msdn.microsoft.com/en-us/library/…
dan

यह डब्ल्यूसीएफ वेब एपीआई के साथ जहाज जाएगा लेकिन मुझे लगता है कि कुछ "अच्छे हिस्से" इसे ढांचे में ही बनाएंगे।
अलेक्जेंडर ज़िट्लर

कोई भी अधिभार विधियाँ क्यों नहीं होती हैं जिनके लिए HttpContentकक्षा की आवश्यकता नहीं होती है ? क्या हमें http पोस्ट बनाने के लिए कम से कम कुछ (यहां तक ​​कि एक खाली स्ट्रिंग) प्रदान करना चाहिए?
तुगबरक

75
आप इस के nullरूप में उपयोग कर सकते हैं HttpContent, यह अनुरोध में कोई निकाय नहीं भेजेगा, जैसेvar response = await client.PostAsync(requestUri, null);
ओवेन विलियम्स

105

पहले यह किया था, बस इसे सरल रखें:

Task<HttpResponseMessage> task = client.PostAsync(url, null);

7
यह स्वीकृत उत्तर की तुलना में क्लीनर है, और इसे मतदान किया जाना चाहिए।
डेविड इबो

4

पाया है कि:

Task<HttpResponseMessage> task = client.PostAsync(url, null);

अनुरोध निकाय के लिए अशक्त जोड़ता है, जो WSO2 पर विफल रहा। के साथ बदल दिया:

Task<HttpResponseMessage> task = client.PostAsync(url, new {});

और काम किया।


मैं इस खोज की पुष्टि नहीं कर सकता (लेकिन मुझे यकीन नहीं है कि मेरा परीक्षण पूरी तरह से पर्याप्त था)। जब मैं किसी nullकंटेंट के साथ अपने स्वयं के एपीआई में पोस्ट करता हूं और उसमें मिलने वाली सामग्री को देखता HttpRequestMessageहूं, तो मुझे लगता है कि मुझे शून्य बाइट्स की लंबाई मिल रही है।
या मैपर

1

इस समस्या को हल करने के लिए, इस उदाहरण का उपयोग करें:

   using (var client = new HttpClient())
            {
                var stringContent = new StringContent(string.Empty);
                stringContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
                var response = client.PostAsync(url, stringContent).Result;
                var result = response.Content.ReadAsAsync<model>().Result;
            }

-6

मुझे लगता है कि यह स्वचालित रूप से होता है यदि आपकी वेब विधि में कोई पैरामीटर नहीं है या वे सभी URL टेम्पलेट में फिट होते हैं।

उदाहरण के लिए यह घोषणा खाली शरीर भेजती है:

  [OperationContract]
  [WebGet(UriTemplate = "mykewlservice/{emailAddress}",
     RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Wrapped)]
  void GetStatus(string emailAddress, out long statusMask);

मैं एक खाली निकाय भेजने की कोशिश कर रहा हूं। HttpClient.Post () विधि के लिए URI और HttpContent ऑब्जेक्ट की आवश्यकता होती है। जब मैं कुछ भी नहीं भेजना चाहता, तो मुझे HttpContent के रूप में पारित नहीं करना चाहिए।
रयान रिनाल्डी

तो आप WCF का उपयोग नहीं कर रहे हैं। यह और भी आसान है: ... HttpWebRequest अनुरोध = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse रिस्पांस = (HttpWebResponse) request.GetResponse (); ... आप प्रतिक्रिया में परिणाम
इवान जी।

1
मैं HttpWebRequest नहीं, HttpClient का उपयोग कर रहा हूं। एक स्ट्रिंग के साथ StringContent का उपयोग करके काम किया।
रयान रिनाल्डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.