HTTP अनुरोध से JSON डेटा प्राप्त करना


97

मेरे पास एक वेब अनुरोध है जो ठीक से काम कर रहा है, लेकिन यह केवल स्थिति ठीक कर रहा है ठीक है, लेकिन मुझे उस वस्तु की आवश्यकता है जो मैं इसे वापस करने के लिए कह रहा हूं। मुझे यकीन नहीं है कि मैं जिस मूल्य का अनुरोध कर रहा हूं उसे कैसे प्राप्त किया जाए। मैं HttpClient ऑब्जेक्ट का उपयोग करने के लिए नया हूं, क्या कोई संपत्ति है जो मुझे याद आ रही है? मुझे वास्तव में रिटर्निंग ऑब्जेक्ट की आवश्यकता है। किसी भी मदद के लिए धन्यवाद

कॉल करना - ठीक चलता है स्थिति ठीक है।

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept
  .Add(new MediaTypeWithQualityHeaderValue("application/json"));
var responseMsg = client.GetAsync(string.Format("http://localhost:5057/api/Photo")).Result;

आपी को विधि मिलती है

//Cut out alot of code but you get the idea
public string Get()
{
    return JsonConvert.SerializeObject(returnedPhoto);
}

क्या आप पूछ रहे हैं कि .NET 4.5 HttpClient वर्ग का उपयोग करते समय प्रतिक्रिया सामग्री कैसे प्राप्त करें?
पनगीओटीस कानावोस

जवाबों:


168

यदि आप .NET 4.5 में System.Net.HttpClient की बात कर रहे हैं, तो आप HttpResponseMessage.Content प्रॉपर्टी को HttpContent -derived ऑब्जेक्ट के रूप में उपयोग करके GetAsync द्वारा लौटाई गई सामग्री प्राप्त कर सकते हैं । फिर आप HttpContent.ReadAsStringAsync विधि का उपयोग करके या ReadAsStreamAsync विधि का उपयोग करके स्ट्रीम के रूप में सामग्री को स्ट्रिंग पर पढ़ सकते हैं ।

HttpClient वर्ग प्रलेखन इस उदाहरण में शामिल हैं:

  HttpClient client = new HttpClient();
  HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/");
  response.EnsureSuccessStatusCode();
  string responseBody = await response.Content.ReadAsStringAsync();

3
यह परीक्षण नहीं किया गया है, लेकिन EnsureSuccessStatusCode के प्रलेखन का कहना है कि "यदि सामग्री शून्य नहीं है, तो यह विधि नि: शुल्क प्रबंधित और अप्रबंधित संसाधनों को निपटान भी कहेगी।" इसलिए आप पहले सामग्री को पढ़ने की इच्छा कर सकते हैं। msdn.microsoft.com/en-us/library/…
रेयान विलियम्स

4
इसका कोई कारण नहीं। जैसा कि रिफ्लेक्टर द्वारा दर्शाया गया है, सुनिश्चित करें कि अपवाद को फेंकने से ठीक पहले, स्थिति कोड के अनुपयुक्त होने पर, EnsureSuccessStatusCode केवल निपटान करेगा। फिर भी एक और मामला जहां प्रलेखन पाठ थोड़ा भ्रमित है।
पनगीओटीस कानावोस

1
सिर्फ क्यों नहीं client.GetStringAsync(...)? क्या यह 2012 के आसपास नहीं था। यदि प्रतिक्रिया 200सही नहीं थी तो वे दोनों एक अपवाद फेंक देंगे ?
सिमोन_विएवर

1
@Simon_Weaver क्योंकि यह सवाल नहीं था - ओपी ने पूछा कि प्रतिक्रिया से स्ट्रिंग को कैसे पढ़ा जाए। वहाँ रहे हैं मतभेद। आप उस प्रतिक्रिया का निरीक्षण नहीं कर सकते हैं GetStringAsyncजिसका अर्थ है कि आप नहीं जानते कि प्रतिक्रिया संदेश क्या था। यदि 3xx रिस्पांस लौटाया जाता है तो आप शायद फेंकना नहीं चाहते। यदि थ्रॉटलिंग त्रुटि वापस आती है, तो आप संभवत : फेंक दिए बिना फिर से प्रयास करना चाहते हैं ।
पनगीओटीस कानावोस

1
@Simon_Weaver एक देखते हैं बहुत कुछ क्यों नहीं - तरीकों में से है कि कॉल करने के लिए GetAsync<T>? या GetStreamAsync और अस्थायी स्ट्रिंग से बचने के लिए स्ट्रीम को Json.NET में पास करें? फिर, GetAsyncपहले उपयोग करने के लिए बेहतर हो सकता है तब सामग्री वस्तु तक
पहुंचें

43

@Panagiotis Kanavos के उत्तर पर बिल्डिंग , यहां उदाहरण के रूप में एक कार्य पद्धति है जो स्ट्रिंग के बजाय ऑब्जेक्ट के रूप में प्रतिक्रिया भी लौटाएगी :

using System.Text;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json; // Nuget Package

public static async Task<object> PostCallAPI(string url, object jsonObject)
{
    try
    {
        using (HttpClient client = new HttpClient())
        {
            var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
            var response = await client.PostAsync(url, content);
            if (response != null)
            {
                var jsonString = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<object>(jsonString);
            }
        }
    }
    catch (Exception ex)
    {
        myCustomLogger.LogException(ex);
    }
    return null;
}

ध्यान रखें कि यह केवल एक उदाहरण है और आप HttpClientइसे उपयोग-खंड में उपयोग करने के बजाय साझा उदाहरण के रूप में उपयोग करना चाहेंगे ।



चूंकि तुरंत रिटर्न का इंतजार है, यह संभव है कि if (response != null)पोस्ट कॉल पूरा होने से पहले निष्पादित किया जाता है?
निशांत

मुझे कोई अंतर नहीं दिखता है, भले ही आपने कहा था कि "स्ट्रिंग के बजाय एक वस्तु के रूप में प्रतिक्रिया लौटाएं।", अगर ऐसा है, तो आप JsonConvert.DeserializedObject (), यानी आप का उपयोग करके एक अतिरिक्त मैन्युअल कदम क्यों कर रहे हैं। इसे प्राप्त होने के बाद (स्ट्रिंग के रूप में) क्लाइंट पर ऑब्जेक्ट में स्ट्रिंग परिवर्तित करना।
joedotnot

11

Microsoft से इस नौगट पैकेज को स्थापित करें System.Net.Http.Json। इसमें विस्तार विधियाँ सम्‍मिलित हैं।

फिर जोड़िए using System.Net.Http.Json

अब, आप इन विधियों को देख सकेंगे:

यहाँ छवि विवरण दर्ज करें

तो अब आप यह कर सकते हैं:

await httpClient.GetFromJsonAsync<IList<WeatherForecast>>("weatherforecast");

स्रोत: https://www.stevejgordon.co.uk/sending-and-receiving-json-use-httpclient-with-system-net-http-json


8

मुझे लगता है कि सबसे छोटा तरीका है:

var client = new HttpClient();
string reqUrl = $"http://myhost.mydomain.com/api/products/{ProdId}";
var prodResp = await client.GetAsync(reqUrl);
if (!prodResp.IsSuccessStatusCode){
    FailRequirement();
}
var prods = await prodResp.Content.ReadAsAsync<Products>();

8
बस सोचा आईडी जोड़ें कि ReadAsAsync एक विस्तार विधि है। आपको .net 4+ और Microsoft.AspNet.WebApi.net के लिए .net कोर के लिए System.Net.Http.Formatting का उपयोग करने की आवश्यकता होगी। यह काम पाने के लिए।
Squibly

0

मैं सामान्य रूप से क्या करता हूं, एक उत्तर के समान:

var response = await httpClient.GetAsync(completeURL); // http://192.168.0.1:915/api/Controller/Object

if (response.IsSuccessStatusCode == true)
    {
        string res = await response.Content.ReadAsStringAsync();
        var content = Json.Deserialize<Model>(res);

// do whatever you need with the JSON which is in 'content'
// ex: int id = content.Id;

        Navigate();
        return true;
    }
    else
    {
        await JSRuntime.Current.InvokeAsync<string>("alert", "Warning, the credentials you have entered are incorrect.");
        return false;
    }

जहां 'मॉडल' आपका C # मॉडल वर्ग है।


0

यह निम्नलिखित तरीके से मेरे लिए ठीक काम कर रहा है -

public async Task<object> TestMethod(TestModel model)
    {
        try
        {
            var apicallObject = new
            {
                Id= model.Id,
                name= model.Name
            };

            if (apicallObject != null)
            {
                var bodyContent = JsonConvert.SerializeObject(apicallObject);
                using (HttpClient client = new HttpClient())
                {
                    var content = new StringContent(bodyContent.ToString(), Encoding.UTF8, "application/json");
                    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    client.DefaultRequestHeaders.Add("access-token", _token); // _token = access token
                    var response = await client.PostAsync(_url, content); // _url =api endpoint url
                    if (response != null)
                    {
                        var jsonString = await response.Content.ReadAsStringAsync();

                        try
                        {
                            var result = JsonConvert.DeserializeObject<TestModel2>(jsonString); // TestModel2 = deserialize object
                        }
                        catch (Exception e){
                            //msg
                            throw e;
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return null;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.