c# - मैं HttpClient.PostAsync को एक ऑब्जेक्ट कैसे पास करूं और JSON बॉडी के रूप में अनुक्रमित करूं?
dotnet-httpclient (3)
मैं
System.Net.Http
का उपयोग कर रहा हूं, मुझे वेब पर कई उदाहरण मिले।
मैं एक
POST
अनुरोध करने के लिए इस कोड को बनाने में कामयाब रहा:
public static string POST(string resource, string token)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(baseUri);
client.DefaultRequestHeaders.Add("token", token);
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("", "")
});
var result = client.PostAsync("", content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;
return resultContent;
}
}
सभी ठीक काम कर रहे हैं।
लेकिन मुझे लगता है कि मैं पोस्टम विधि के लिए एक तीसरा परम पारित करना चाहता हूं, एक परम
data
कहा जाता
data
।
डेटा परम इस तरह से एक वस्तु है:
object data = new
{
name = "Foo",
category = "article"
};
मैं कैसे कर सकता हूँ बिना
KeyValuePair
बनाने के?
मेरी php
RestAPI
एक json इनपुट की प्रतीक्षा करती है, इसलिए
FormUrlEncodedContent
को सही ढंग से
raw
FormUrlEncodedContent
को भेजना चाहिए।
लेकिन मैं
Microsoft.Net.Http
साथ ऐसा कैसे कर सकता हूं?
धन्यवाद।
आपके प्रश्न का सीधा उत्तर है: नहीं।
PostAsync
विधि के लिए हस्ताक्षर निम्नानुसार है:
सार्वजनिक टास्क पोस्टएन्स्प्स (उरी अनुरोध, HttpContent कंटेंट)
इसलिए, जब आप
PostAsync
को
object
पास कर सकते हैं तो यह
HttpContent
प्रकार का होना चाहिए और आपका अनाम प्रकार उस मानदंड को पूरा नहीं करता है।
हालाँकि, आप जो पूरा करना चाहते हैं उसे पूरा करने के तरीके हैं। सबसे पहले, आपको अपने अनाम प्रकार को JSON पर क्रमांकित करना होगा , इसके लिए सबसे सामान्य उपकरण Json.NET है । और इस कोड के लिए बहुत तुच्छ है:
var myContent = JsonConvert.SerializeObject(data);
इसके बाद, आपको इस डेटा को भेजने के लिए एक कंटेंट ऑब्जेक्ट का निर्माण करने की आवश्यकता होगी, मैं एक
ByteArrayContent
ऑब्जेक्ट का उपयोग करूंगा, लेकिन यदि आप चाहते थे तो आप एक अलग प्रकार का उपयोग या निर्माण कर सकते थे।
var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
var byteContent = new ByteArrayContent(buffer);
इसके बाद, आप API को JSON है यह बताने के लिए सामग्री प्रकार सेट करना चाहते हैं।
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
तब आप अपने पिछले उदाहरण के साथ अपने अनुरोध को फॉर्म सामग्री के साथ भेज सकते हैं:
var result = client.PostAsync("", byteContent).Result
एक साइड नोट पर,
.Result
प्रॉपर्टी जैसे आप यहां कर रहे हैं, कुछ
खराब साइड इफेक्ट्स
जैसे डेड लॉकिंग हो सकते हैं, इसलिए आप इससे सावधान रहना चाहते हैं।
आपको
FormUrlEncodedContent
बजाय एक कच्चे स्ट्रिंग के रूप में अनुरोध निकाय में अपना डेटा पास करने की आवश्यकता है।
ऐसा करने का एक तरीका इसे JSON स्ट्रिंग में क्रमबद्ध करना है:
var json = JsonConvert.SerializeObject(data);
अब आपको केवल स्ट्रिंग को पोस्ट विधि में पास करना होगा।
var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json");
var client = new HttpClient();
var response = await client.PostAsync(uri, stringContent);
Microsoft ASP.NET Web API 2.2 Client
का उपयोग करने के लिए एक सरल उपाय है
NuGet
।
तब आप बस ऐसा कर सकते हैं और यह JSON पर ऑब्जेक्ट को सीरियल करेगा और
Content-Type
हेडर को
application/json; charset=utf-8
सेट करेगा
application/json; charset=utf-8
application/json; charset=utf-8
:
var data = new
{
name = "Foo",
category = "article"
};
var client = new HttpClient();
client.BaseAddress = new Uri(baseUri);
client.DefaultRequestHeaders.Add("token", token);
var response = await client.PostAsJsonAsync("", data);