वेब एपीआई से HttpClient के साथ पोस्टिंग JsonObject


289

मैं एक JsonObjectप्रयोग करके POST की कोशिश कर रहा हूँHttpClient वेब API से । मुझे पूरा यकीन नहीं है कि इस बारे में कैसे जाना है और नमूना कोड के तरीके में बहुत कुछ नहीं मिल सकता है।

यहाँ मेरे पास अभी तक क्या है:

var myObject = (dynamic)new JsonObject();
myObject.Data = "some data";
myObject.Data2 = "some more data";

HttpClient httpClient = new HttpClient("myurl");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = httpClient.Post("", ???);

मैं मैं अपने कास्ट करने के लिए की जरूरत है JsonObjectएक के रूप में StreamContent, लेकिन मैं उस चरण की काट दिया हो रही।

जवाबों:


441

पैकेज के नए संस्करण के साथ HttpClientऔर इसके बिना WebApiयह होगा:

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
var result = client.PostAsync(url, content).Result;

या यदि आप इसे चाहते हैं async:

var result = await client.PostAsync(url, content);

3
उस ओवरलोडिंग StringContent कंस्ट्रक्टर ने मेरे लिए यह ट्रिक की।
कैप्टन केनपाची

23
परिणाम को Async पद्धति पर कॉल करने से पहले दो बार सोचें हालांकि blog.stephencleary.com/2012/07/dont-block-on-async-code.html
रुचिरा

2
किसी को भी जो usingमुझे इस तरह से फेंकने के लिए लुभा
maxshuty

मैं हालांकि निर्माण के usingचारों ओर डाल दिया StringContent
बीसीआर

इस उत्तर का उपयोग करते हुए मैं एक एपीआई से "400 बैड रिक्वेस्ट" प्रतिक्रिया प्राप्त करता रहा जिसे मैं अपना JSON अनुरोध (विजुअल स्टूडियो 2017, .NET 4.6.2) पोस्ट कर रहा था। इसके अलावा var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json")मुझे सेट करना पड़ा content.Headers.ContentType = new MediaTypeHeaderValue("application/json");। अधिक विवरण के लिए नीचे उत्तर देखें।
एंथल्स

161

StringContentअपने JSON ऑब्जेक्ट के JSON प्रतिनिधित्व के साथ, इसका उपयोग करने का सबसे आसान तरीका है ।

httpClient.Post(
    "",
    new StringContent(
        myObject.ToString(),
        Encoding.UTF8,
        "application/json"));

14
सामग्री प्रकार पर ध्यान दें। मैंने इसे छोड़ दिया और मुझे जितना चाहिए था उससे अधिक समय तक डिबगिंग की।
ज़ापोनोलिका

आप StringContent उदाहरण हालांकि निपटाना नहीं चाहिए?
फिल हैसेलडेन

63

अपने .NET संस्करण के आधार पर आप HttpClientExtensions.PostAsJsonAsyncविधि का उपयोग भी कर सकते हैं ।

https://msdn.microsoft.com/en-us/library/system.net.http.httpclientextensions.postasjsonasync.aspx


4
अब Microsoft.AspNet.Client.WebApi nuget में पाया गया
jle

2
मैंने इसे Microsoft.AspNet.WebApi.Client
एड्रियन डावेल

इससे मेरी समस्या हल हो गई। मैं एक (#) के लिए एक सी # क्लास पास करते समय गड़बड़ कर रहा था जिसमें कुछ गुण शामिल थे जो क्लाइंट का उपयोग करके सूची थे। यदि सरणी खाली थी, तो मेरा API समाधान इसे उठाएगा, लेकिन यदि सरणी में कोई आइटम था, तो नियंत्रक विधि JSON को बांधने में सक्षम नहीं थी। इसके लिए धन्यवाद .. मुझे लगता है कि PostAsJsonAsync अधिक मज़बूती से एक जटिल C # ऑब्जेक्ट को JSON में कनवर्ट करता है।
फ्रैंकलिन टार्टर

क्या इसके लिए कोई नगेट पैकेज है? जब मैं प्रोजेक्ट को एक नई मशीन में स्थानांतरित करता हूं, तो मुझे इससे नफरत है, और यह संदर्भ हमेशा गायब है।
जैपनोग्लिका

इस या कुछ और के लिए खोज रहे हैं? nuget.org/packages/Microsoft.AspNet.WebApi.Client
user3285954

51

यदि Newtonsoft.Json का उपयोग कर रहे हैं:

using Newtonsoft.Json;
using System.Net.Http;
using System.Text;

public static class Extensions
{
    public static StringContent AsJson(this object o)
        => new StringContent(JsonConvert.SerializeObject(o), Encoding.UTF8, "application/json");
}

उदाहरण:

var httpClient = new HttpClient();
var url = "https://www.duolingo.com/2016-04-13/login?fields=";
var data = new { identifier = "username", password = "password" };
var result = await httpClient.PostAsync(url, data.AsJson())

यह asp.net कोर विशिष्ट नहीं है, इसका वास्तव में सामान्य 4.5.6 तक नीचे है
danatcofo

JsonConvert.SerializeObjectDateTimes ISO 8601 का उपयोग करते हुए मुद्दे : स्थानीय या UTC ... hackered.co.uk/articles/…
Kiquenet

21

मेरे पास pomber से उत्तर पर टिप्पणी जोड़ने के लिए पर्याप्त प्रतिष्ठा नहीं है इसलिए मैं एक और उत्तर पोस्ट कर रहा हूं। पोम्बर के दृष्टिकोण का उपयोग करते हुए मैंने एक एपीआई से "400 बैड रिक्वेस्ट" प्रतिक्रिया प्राप्त की जिसे मैं अपने JSON अनुरोध (विजुअल स्टूडियो 2017, .NET 4.6.2) पर पोस्ट कर रहा था। अंततः समस्या का पता StringContent () द्वारा गलत (" https://github.com/dotnet/corefx/issues/7864 देखें) द्वारा उत्पादित" सामग्री-प्रकार "शीर्षक से लगाया गया था ।

tl; डॉ

अनुरोध पर हेडर को सही ढंग से सेट करने के लिए एक अतिरिक्त लाइन के साथ पॉमर के उत्तर का उपयोग करें:

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;

धन्यवाद, एंथेल्स। var सामग्री = नया StringContent (jsonObject.ToString (), Encoding.UTF8, "application / json") पर्याप्त नहीं था। इसके लिए कंटेंट चाहिए। Headers.ContentType = new MediaTypeHeaderValue ("एप्लिकेशन / जसन"); मेरी पवित्रता को बचाने के लिए धन्यवाद।
गेल फाद

1
यह बहुत अच्छा काम किया। किसी भी कारण से "एप्लिकेशन / जसन" को दो बार सेट करने की जरूरत है, एक कंस्ट्रक्टर में और एक बार संपत्ति के माध्यम से? यह एक बग है?
फेस्टस मार्टिंगेल

@FestusMartingale: अच्छा सवाल! गितुब मुद्दे के मेरे पढ़ने (उत्तर में जुड़ा हुआ) से "application/json", StringContentनिर्माता में उत्तीर्ण होने की संभवतः आवश्यकता नहीं है क्योंकि यह परिणामी content.Headers.ContentTypeसंपत्ति पर स्पष्ट रूप से सेट किया जा रहा है । हालाँकि, मैंने कोड में इसका परीक्षण नहीं किया है।
एंथल्स

ऐसा लगता है कि सर्वर पूर्ण सामग्री प्रकार स्ट्रिंग का समर्थन नहीं करता है। जब आप ContentType को ओवरराइड किए बिना कंस्ट्रक्टर का उपयोग करते हैं, तो यह मान को सेट करता है application/json; charset=utf-8
बर्टम 13

2

vbnet में इस पर कोड:

dim FeToSend as new (object--> define class)

Dim client As New HttpClient
Dim content = New StringContent(FeToSend.ToString(), Encoding.UTF8,"application/json")
content.Headers.ContentType = New MediaTypeHeaderValue( "application/json" )
Dim risp = client.PostAsync(Chiamata, content).Result

msgbox(risp.tostring)

उममीद है कि इससे मदद मिलेगी

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