.NET कंसोल से JSON WebService को कॉल करने का सबसे अच्छा तरीका है


89

मैं ASP.Net MVC3 में एक वेब सेवा की मेजबानी कर रहा हूं जो कि एक JSON स्ट्रिंग देता है। एसी # कंसोल एप्लिकेशन से वेबसेवा को कॉल करने का सबसे अच्छा तरीका क्या है, और एक .NET ऑब्जेक्ट में रिटर्न पार्स करें?

क्या मुझे अपने कंसोल ऐप में MVC3 का संदर्भ देना चाहिए?

Json.Net के पास .NET ऑब्जेक्ट्स को क्रमांकित और डीसर्विलाइज़ करने के लिए कुछ अच्छे तरीके हैं, लेकिन मैं यह नहीं देखता कि इसमें webservice से पोस्टिंग और गेटिंग मानों के लिए तरीके हैं।

या मैं सिर्फ वेब सेवा के लिए पोस्टिंग और GETing के लिए अपने स्वयं के सहायक विधि बनाना चाहिए? मैं अपनी .net वस्तु को प्रमुख मूल्य युग्मों में कैसे अनुक्रमित करूंगा?

जवाबों:


141

मैं वेब सेवा से GET को HttpWebRequest का उपयोग करता हूं, जो मुझे JSON स्ट्रिंग देता है। यह एक GET के लिए कुछ इस तरह दिखता है:

// Returns JSON string
string GET(string url) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    try {
        WebResponse response = request.GetResponse();
        using (Stream responseStream = response.GetResponseStream()) {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
            return reader.ReadToEnd();
        }
    }
    catch (WebException ex) {
        WebResponse errorResponse = ex.Response;
        using (Stream responseStream = errorResponse.GetResponseStream())
        {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding("utf-8"));
            String errorText = reader.ReadToEnd();
            // log errorText
        }
        throw;
    }
}

मैं तो स्ट्रिंग को गतिशील रूप से पार्स करने के लिए JSON.Net का उपयोग करता हूं । वैकल्पिक रूप से, आप इस कोडप्लेक्स टूल का उपयोग करके नमूना JSON आउटपुट से C # वर्ग को सांख्यिकीय रूप से उत्पन्न कर सकते हैं: http://jsonclassgenerator.codeplex.com/

POST इस तरह दिखता है:

// POST a JSON string
void POST(string url, string jsonContent) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";

    System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
    Byte[] byteArray = encoding.GetBytes(jsonContent);

    request.ContentLength = byteArray.Length;
    request.ContentType = @"application/json";

    using (Stream dataStream = request.GetRequestStream()) {
        dataStream.Write(byteArray, 0, byteArray.Length);
    }
    long length = 0;
    try {
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
            length = response.ContentLength;
        }
    }
    catch (WebException ex) {
        // Log exception and throw as for GET example above
    }
}

मैं इस कोड का उपयोग हमारी वेब सेवा के स्वचालित परीक्षणों में करता हूं।


JsonClassGenerator कमाल है। डिसेरिएलाइज़ेशन आसान है क्योंकि आप जन्स स्ट्रिंग को पास करके केवल जोरदार टाइप की गई वस्तु का निर्माण करते हैं।
एरोनल्स

यदि आपके पास गैर-एससीआई सेट में वर्ण हैं, तो आपके पास कोड को थोड़ा बदलना होगा। ContentLength पोस्ट की गई सामग्री में बाइट्स की संख्या का प्रतिनिधित्व करती है, इसलिए तकनीकी रूप से अनुरोध करें। कॉन्टेंट लैंथ को byteArray.Length पर सेट किया जाना चाहिए, न कि jsonContent.Length।
ग्रैडी वर्नर

Encoding.GetEncoding("utf-8")द्वारा प्रतिस्थापित किया जा सकता हैEncoding.UTF8
जोएलफैन

धन्यवाद, यह बहुत मददगार है
श्वेता

प्राधिकरण टोकन के भाग के रूप में सेट किया जाएगा, लेकिन परीक्षण करने के लिए हमें हेडर भी पास करना पड़ सकता है। इस अनुरोध की तरह। मेथोड = "जीईटी"; request.Timeout = 20000; request.CententType = "एप्लिकेशन / json"; request.Headers.Add ("प्राधिकरण", "बियरर अपने टोकन:
कुरकुला

51

जाॅन को .NET ऑब्जेक्ट में डेजर्टाइज करने के लिए रिमोट url और JavaScriptSerializer या Json.NET से कंटेंट लाने के लिए WebClient । उदाहरण के लिए आप एक मॉडल वर्ग को परिभाषित करते हैं जो JSON संरचना को दर्शाएगा और फिर:

using (var client = new WebClient())
{
    var json = client.DownloadString("http://example.com/json");
    var serializer = new JavaScriptSerializer();
    SomeModel model = serializer.Deserialize<SomeModel>(json);
    // TODO: do something with the model
}

कुछ REST क्लाइंट फ्रेमवर्क भी हैं जिन्हें आप RestSharp जैसे चेकआउट कर सकते हैं ।


@BrokeMyLegBiking, कौन सा? इसका ASPAjax से कोई लेना-देना नहीं है। यदि आप JavaScriptSerializer वर्ग के बारे में बात कर रहे हैं तो इसे .NET में बनाया गया है। System.eb.Extensions विधानसभा में आपको कुछ भी डाउनलोड या इंस्टॉल करने की आवश्यकता नहीं है।
डारिन दिमित्रोव

क्या एसी # ऑब्जेक्ट के सभी प्रॉपर्टीज / प्रॉपर्टी वैल्यू को POST की-वैल्यू पेयर (या GET की-वैल्यू पेयर) में बदलने का एक तरीका है? ताकि मैं प्रभावी रूप से अपने webservice विधि के इनपुट मूल्य के रूप में c # ऑब्जेक्ट का उपयोग कर सकूं?
ब्रुकमाइलेजबाइकिंग

@BrokeMyLegBiking, जो कि आपके पास क्या वस्तु है और कैसे वेब सेवा इनपुट की उम्मीद करती है पर निर्भर करेगी।
डारिन दिमित्रोव

3
मैं वास्तव में RestSharp लाइब्रेरी का आनंद ले चुका हूं। उस उल्लेख के लिए धन्यवाद।
ब्रायन रे

1
डैरन आप इसे अपडेट कर सकते हैं, client.downloadstring () अब व्यवहार्य नहीं है।
जेएमईएम

9

यद्यपि मौजूदा उत्तर मान्य दृष्टिकोण हैं, वे प्राचीन हैं। HttpClient रेस्टफुल वेब सेवाओं के साथ काम करने के लिए एक आधुनिक इंटरफ़ेस है। लिंक में पृष्ठ के उदाहरण अनुभाग की जांच करें, इसमें एसिंक्रोनस HTTP GET के लिए बहुत ही सीधा उपयोग मामला है।

using (var client = new System.Net.Http.HttpClient())
{
    return await client.GetStringAsync("https://reqres.in/api/users/3"); //uri
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.