HttpClient PostAsJsonAsync का उपयोग करके ASP.NET कोर में HTTP POST संदेश भेजें


143

मैं जैसे डायनेमिक ऑब्जेक्ट भेजना चाहता हूं

new { x = 1, y = 2 };

HTTP POST संदेश के मुख्य भाग के रूप में। इसलिए मैं लिखने की कोशिश करता हूं

var client = new HttpClient();

लेकिन मुझे विधि नहीं मिल रही है

client.PostAsJsonAsync()

इसलिए मैंने Microsoft.AspNetCore.Http.Extensions पैकेज को प्रोजेक्ट.जॉन में जोड़ने और जोड़ने की कोशिश की

using Microsoft.AspNetCore.Http.Extensions; 

खंड का उपयोग करने के लिए। हालाँकि इसने मेरी मदद नहीं की।

तो ASP.NET Core में JSON बॉडी के साथ POST रिक्वेस्ट भेजने का सबसे आसान तरीका क्या है?


आश्चर्य है कि इस लेख में POST docs.microsoft.com/en-us/dotnet/csharp/tutorials/… के
14

जवाबों:


206

आपको "Microsoft.AspNet.WebApi.Client" पैकेज का संदर्भ जोड़ना चाहिए ( नमूनों के लिए यह लेख पढ़ें )।

बिना किसी अतिरिक्त एक्सटेंशन के, आप मानक PostAsyncविधि का उपयोग कर सकते हैं :

client.PostAsync(uri, new StringContent(jsonInString, Encoding.UTF8, "application/json"));

जहाँ jsonInStringआप कॉल करके मूल्य प्राप्त कर सकते हैंJsonConvert.SerializeObject(<your object>);


1
लेकिन Microsoft.AspNet.WebApi.Client ASP.NET Core RC2 लाइब्रेरी की तरह नहीं दिखता है। और सीकॉन तरीका वास्तव में कोड पुनरावृत्ति का बहुत अधिक है (
रेम

@ क्यों आप दूसरे तरीके का उपयोग करने के लिए एक HttpClient एक्सटेंशन विधि ( PostAsJsonAsync) नहीं बनाते हैं । यह आपको कोड पुनरावृत्ति से बचने में सक्षम बनाता है।
एडेम कैगलिन

1
ज़रूर। लेकिन मैंने सवाल पूछा था कि क्या मुझे कुछ याद आ रहा है। मुझे विश्वास नहीं हो रहा है कि इसे अभी तक कोर में लागू नहीं किया गया है!
रेम

1
यह लाइब्रेरी एक कोर / .नेट-मानक नहीं है, मुझे नहीं लगता कि System.Net.Http.Formatting को अभी तक पोर्ट किया गया है
क्रिस एस।

1
यह nuget पैकेज Microsoft.Extensions.Http से .NET कोर 2.2 में IHttpClientFactory द्वारा बनाई गई HttpClient के लिए काम करेगा। हालाँकि, आप इसे इस तरह से कैसे करते हैं लेकिन हेडर जोड़ते हैं जैसे कि प्राधिकरण कुंजी।
निक गैलीमोर

98

मैं इस वर्ग का उपयोग करता हूं:

public class JsonContent : StringContent
{
    public JsonContent(object obj) :
        base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
    { }
}

उपयोग का नमूना:

new HttpClient().PostAsync("http://...", new JsonContent(new { x = 1, y = 2 }));

5
एक्सटेंशन पद्धति क्यों नहीं? सार्वजनिक स्थैतिक वर्ग JsonContent {सार्वजनिक कार्य <?> PostAsJSonAsync (यह HttpClient क्लाइंट, ऑब्जेक्ट toSerializeAsJson) {...}}
TamusJRoyce

2
मुझे JsonContent क्लास अप्रोच पसंद है
Marco Alves

क्या यह Content-Length:HTTP शीर्ष लेख सेट करता है ?
व्याचेस्लाव नेपाडोव्स्की

1
@VyacheslavNapadovsky यह HttpClientसेटिंग्स पर निर्भर करता है , उदाहरण के लिए यदि एक सेट client.DefaultRequestHeaders.TransferEncodingChunked = true Content-Lengthहेडर सेट नहीं किया जाएगा और Transfer-Encoding: chunkedइसके बजाय सेट किया जाएगा। हालाँकि, यदि कोई ग्राहक जैसा बनाता है, तो डिफ़ॉल्ट रूप से इस सामग्री वर्ग के लिए var client = new HttpClient();शीर्ष लेख Content-Lengthसेट किया जाएगा।
स्टॉप-क्रेन

12

मैं स्वीकृत उत्तर में जोड़ दूंगा जिसे आप Acceptशीर्ष लेख में जोड़ना चाहते हैं httpClient:

httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

हाँ, मेरे लिए यह भी आवश्यक है, पोस्टमैन का उपयोग करके पुष्टि की गई।
वेहुई गुओ

1

आप सही हैं कि यह लंबे समय से .NET कोर में लागू किया गया है।

लेखन के समय (सितंबर 2019), project.jsonNuGet 3.x + की फ़ाइल को नीचे दिया गया है PackageReference(जैसा कि https://docs.microsoft.com/en-us/nuget/archive/project-json पर समझाया गया है )।

कक्षा के *Asyncतरीकों तक पहुंचने के लिए HttpClient, आपकी .csprojफ़ाइल को सही ढंग से कॉन्फ़िगर किया जाना चाहिए।

अपनी .csprojफ़ाइल को एक सादे टेक्स्ट एडिटर में खोलें , और सुनिश्चित करें कि पहली पंक्ति है
<Project Sdk="Microsoft.NET.Sdk.Web">
(जैसा कि https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#the पर बताया गया है) -एसपीआरओजे-प्रारूप )।

कक्षा के *Asyncतरीकों तक पहुंचने के लिए HttpClient, आपको अपनी फ़ाइल में सही पैकेज संदर्भ भी रखना होगा .csproj, जैसे:

<ItemGroup>
    <!-- ... -->
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <!-- ... -->
</ItemGroup>

(देखें https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference । इसके अलावा: हम ASP + Core 2.1 और। बाद में Microsoft.AspNetCore.App रूपक , https://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage ) का उपयोग करें

जैसे तरीके PostAsJsonAsync, ReadAsAsync, PutAsJsonAsyncऔर DeleteAsyncअब बाहर बॉक्स के काम करना चाहिए। (आवश्यक निर्देश का उपयोग नहीं कर रहा है।)

अद्यतन: PackageReference टैग .NET .NET 3.0 में आवश्यक नहीं है।


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