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);




dotnet-httpclient