मैं C # का उपयोग करके REST एपि पर कॉल कैसे कर सकता हूं?


335

यह मेरे पास अब तक का कोड है:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Net.Http;
using System.Web;
using System.Net;
using System.IO;

namespace ConsoleProgram
{
    public class Class1
    {
        private const string URL = "https://sub.domain.com/objects.json?api_key=123";
        private const string DATA = @"{""object"":{""name"":""Name""}}";

        static void Main(string[] args)
        {
            Class1.CreateObject();
        }

        private static void CreateObject()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
            request.Method = "POST";
            request.ContentType = "application/json"; 
            request.ContentLength = DATA.Length;
            StreamWriter requestWriter = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
            requestWriter.Write(DATA);
            requestWriter.Close();

             try {
                WebResponse webResponse = request.GetResponse();
                Stream webStream = webResponse.GetResponseStream();
                StreamReader responseReader = new StreamReader(webStream);
                string response = responseReader.ReadToEnd();
                Console.Out.WriteLine(response);
                responseReader.Close();
            } catch (Exception e) {
                Console.Out.WriteLine("-----------------");
                Console.Out.WriteLine(e.Message);
            }

        }
    }
}

समस्या यह है कि मुझे लगता है कि अपवाद ब्लॉक को ट्रिगर किया जा रहा है (क्योंकि जब मैं कोशिश-कैच को हटाता हूं, तो मुझे एक सर्वर त्रुटि (500) संदेश मिलता है। लेकिन मुझे कंसोल नहीं दिखाई देता है। लेकिन मैं पकड़ने वाले ब्लॉक में डाल देता हूं।

मेरा कंसोल:

The thread 'vshost.NotifyLoad' (0x1a20) has exited with code 0 (0x0).
The thread '<No Name>' (0x1988) has exited with code 0 (0x0).
The thread 'vshost.LoadReference' (0x1710) has exited with code 0 (0x0).
'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Loaded 'c:\users\l. preston sego iii\documents\visual studio 11\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe', Symbols loaded.
'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
A first chance exception of type 'System.Net.WebException' occurred in System.dll
The thread 'vshost.RunParkingWindow' (0x184c) has exited with code 0 (0x0).
The thread '<No Name>' (0x1810) has exited with code 0 (0x0).
The program '[2780] ConsoleApplication1.vshost.exe: Program Trace' has exited with code 0 (0x0).
The program '[2780] ConsoleApplication1.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).

मैं विजुअल स्टूडियो 2011 बीटा और .NET 4.5 बीटा का उपयोग कर रहा हूं।


इसके अलावा, क्या आपने यह देखने के लिए ब्रेक पॉइंट लगाए हैं कि वास्तव में यह कहाँ बह रहा है?
NotMe

यह आउटपुट विंडो से नहीं बल्कि कंसोल से होता है
सर्ज-टीएम

5
: MSDN RESTful सेवाओं के निर्माण पर एक उत्कृष्ट लेख था msdn.microsoft.com/library/dd203052.aspx : ... और RESTful ग्राहकों msdn.microsoft.com/en-us/magazine/ee309509.aspx
लिन ढहते

@ क्रिस इस आईई के साथ क्या करना है? = \ Request.GetResponse लाइन पर यह उड़ रहा है।
NullVoxPopuli 15

@TheLindyHop; बिल्कुल कुछ नहीं। मैंने गलत पढ़ लिया।
NotMe

जवाबों:


427

ASP.Net वेब API ने पहले उल्लेखित WCF वेब API को बदल दिया है।

मैंने सोचा था कि मैं इन अद्यतनों में से अधिकांश के बाद से 2012 के शुरू में एक अद्यतन जवाब पोस्ट करूंगा, और जब "कॉल रेस्टफुल सर्विस सी #" के लिए Google खोज कर रहा है तो यह धागा शीर्ष परिणामों में से एक है।

Microsoft का वर्तमान मार्गदर्शन Microsoft ASP.NET वेब API क्लाइंट लाइब्रेरीज़ का उपयोग एक Restful सेवा का उपभोग करने के लिए है। यह एक NuGet पैकेज, Microsoft.AspNet.WebApi.Client के रूप में उपलब्ध है। आपको अपने समाधान में इस NuGet पैकेज को जोड़ने की आवश्यकता होगी।

ASP.Net वेब API क्लाइंट लाइब्रेरी का उपयोग करते समय आपका उदाहरण कैसा दिखेगा:

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers; 

namespace ConsoleProgram
{
    public class DataObject
    {
        public string Name { get; set; }
    }

    public class Class1
    {
        private const string URL = "https://sub.domain.com/objects.json";
        private string urlParameters = "?api_key=123";

        static void Main(string[] args)
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri(URL);

            // Add an Accept header for JSON format.
            client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

            // List data response.
            HttpResponseMessage response = client.GetAsync(urlParameters).Result;  // Blocking call! Program will wait here until a response is received or a timeout occurs.
            if (response.IsSuccessStatusCode)
            {
                // Parse the response body.
                var dataObjects = response.Content.ReadAsAsync<IEnumerable<DataObject>>().Result;  //Make sure to add a reference to System.Net.Http.Formatting.dll
                foreach (var d in dataObjects)
                {
                    Console.WriteLine("{0}", d.Name);
                }
            }
            else
            {
                Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
            }

            //Make any other calls using HttpClient here.

            //Dispose once all HttpClient calls are complete. This is not necessary if the containing object will be disposed of; for example in this case the HttpClient instance will be disposed automatically when the application terminates so the following call is superfluous.
            client.Dispose();
        }
    }
}

यदि आप कई अनुरोध करने की योजना बनाते हैं, तो आपको अपने HttpClient उदाहरण का फिर से उपयोग करना चाहिए। इस प्रश्न और इसके विवरणों के बारे में अधिक जानकारी के लिए देखें कि इस मामले में HttpClient उदाहरण पर एक उपयोग किए गए कथन का उपयोग क्यों नहीं किया गया था: क्या HttpClient और HttpClientHandler का निपटान किया जाना है?

अन्य उदाहरण सहित, अधिक जानकारी के लिए, यहां जाएं : http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

यह ब्लॉग पोस्ट उपयोगी भी हो सकती है: http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/


6
धन्यवाद! इसके लिए काम करने के लिए मुझे WebApi क्लाइंट NuGet पैकेज स्थापित करने की आवश्यकता थी: Install-Package Microsoft.AspNet.WebApi.Client
Ev।

3
यदि आपको अपने REST एकीकरण का मजाक उड़ाना है, तो भी ग्राहक पुस्तकालयों के साथ यह अभी भी आसान नहीं है। RestSharp आज़माएं?
रोब चर्च

6
इस उत्तर को पहले से बेहतर बनाने के लिए, आपको अपने संसाधन को बेहतर तरीके से प्रबंधित करने के लिए एक स्टेटमेंट का उपयोग करके HttpClient घोषणा को लपेटना चाहिए :)
डैनियल सिबर्ट

7
ReadAsAsync () का उपयोग करने में असमर्थ, लेकिन त्रुटि प्राप्त करने में असमर्थ "HttpContent में 'ReadAsAsync' की परिभाषा नहीं है और कोई एक्सटेंशन विधि नहीं है।
रॉबर्ट ग्रीन MBA

7
@RobertGreenMBA: विस्तार विधि प्राप्त करने के लिए ReadAsAsync(), एक संदर्भ जोड़ें System.Net.Http.Formatting.dll। (सहज, सही?)
एरिन

122

मेरा सुझाव RestSharp का उपयोग करना होगा । आप REST सेवाओं पर कॉल कर सकते हैं और उन्हें POCO ऑब्जेक्ट में बहुत कम बॉयलरप्लेट कोड के साथ डाल सकते हैं, वास्तव में प्रतिक्रिया के माध्यम से पार्स करना होगा। यह आपकी विशेष त्रुटि को हल नहीं करेगा, लेकिन आपके समग्र सवाल का जवाब देता है कि REST सेवाओं पर कॉल कैसे करें। उपयोग करने के लिए अपने कोड को बदलने के बाद इसे उपयोग में आसानी और आगे बढ़ने में मजबूती का भुगतान करना चाहिए। हालांकि यह सिर्फ मेरा 2 सेंट है

उदाहरण:

namespace RestSharpThingy
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Reflection;

    using RestSharp;

    public static class Program
    {
        public static void Main()
        {
            Uri baseUrl = new Uri("https://httpbin.org/");
            IRestClient client = new RestClient(baseUrl);
            IRestRequest request = new RestRequest("get", Method.GET) { Credentials = new NetworkCredential("testUser", "P455w0rd") };

            request.AddHeader("Authorization", "Bearer qaPmk9Vw8o7r7UOiX-3b-8Z_6r3w0Iu2pecwJ3x7CngjPp2fN3c61Q_5VU3y0rc-vPpkTKuaOI2eRs3bMyA5ucKKzY1thMFoM0wjnReEYeMGyq3JfZ-OIko1if3NmIj79ZSpNotLL2734ts2jGBjw8-uUgKet7jQAaq-qf5aIDwzUo0bnGosEj_UkFxiJKXPPlF2L4iNJSlBqRYrhw08RK1SzB4tf18Airb80WVy1Kewx2NGq5zCC-SCzvJW-mlOtjIDBAQ5intqaRkwRaSyjJ_MagxJF_CLc4BNUYC3hC2ejQDoTE6HYMWMcg0mbyWghMFpOw3gqyfAGjr6LPJcIly__aJ5__iyt-BTkOnMpDAZLTjzx4qDHMPWeND-TlzKWXjVb5yMv5Q6Jg6UmETWbuxyTdvGTJFzanUg1HWzPr7gSs6GLEv9VDTMiC8a5sNcGyLcHBIJo8mErrZrIssHvbT8ZUPWtyJaujKvdgazqsrad9CO3iRsZWQJ3lpvdQwucCsyjoRVoj_mXYhz3JK3wfOjLff16Gy1NLbj4gmOhBBRb8rJnUXnP7rBHs00FAk59BIpKLIPIyMgYBApDCut8V55AgXtGs4MgFFiJKbuaKxq8cdMYEVBTzDJ-S1IR5d6eiTGusD5aFlUkAs9NV_nFw");
            request.AddParameter("clientId", 123);

            IRestResponse<RootObject> response = client.Execute<RootObject>(request);

            if (response.IsSuccessful)
            {
                response.Data.Write();
            }
            else
            {
                Console.WriteLine(response.ErrorMessage);
            }

            Console.WriteLine();

            string path = Assembly.GetExecutingAssembly().Location;
            string name = Path.GetFileName(path);

            request = new RestRequest("post", Method.POST);
            request.AddFile(name, File.ReadAllBytes(path), name, "application/octet-stream");
            response = client.Execute<RootObject>(request);
            if (response.IsSuccessful)
            {
                response.Data.Write();
            }
            else
            {
                Console.WriteLine(response.ErrorMessage);
            }

            Console.ReadLine();
        }

        private static void Write(this RootObject rootObject)
        {
            Console.WriteLine("clientId: " + rootObject.args.clientId);
            Console.WriteLine("Accept: " + rootObject.headers.Accept);
            Console.WriteLine("AcceptEncoding: " + rootObject.headers.AcceptEncoding);
            Console.WriteLine("AcceptLanguage: " + rootObject.headers.AcceptLanguage);
            Console.WriteLine("Authorization: " + rootObject.headers.Authorization);
            Console.WriteLine("Connection: " + rootObject.headers.Connection);
            Console.WriteLine("Dnt: " + rootObject.headers.Dnt);
            Console.WriteLine("Host: " + rootObject.headers.Host);
            Console.WriteLine("Origin: " + rootObject.headers.Origin);
            Console.WriteLine("Referer: " + rootObject.headers.Referer);
            Console.WriteLine("UserAgent: " + rootObject.headers.UserAgent);
            Console.WriteLine("origin: " + rootObject.origin);
            Console.WriteLine("url: " + rootObject.url);
            Console.WriteLine("data: " + rootObject.data);
            Console.WriteLine("files: ");
            foreach (KeyValuePair<string, string> kvp in rootObject.files ?? Enumerable.Empty<KeyValuePair<string, string>>())
            {
                Console.WriteLine("\t" + kvp.Key + ": " + kvp.Value);
            }
        }
    }

    public class Args
    {
        public string clientId { get; set; }
    }

    public class Headers
    {
        public string Accept { get; set; }

        public string AcceptEncoding { get; set; }

        public string AcceptLanguage { get; set; }

        public string Authorization { get; set; }

        public string Connection { get; set; }

        public string Dnt { get; set; }

        public string Host { get; set; }

        public string Origin { get; set; }

        public string Referer { get; set; }

        public string UserAgent { get; set; }
    }

    public class RootObject
    {
        public Args args { get; set; }

        public Headers headers { get; set; }

        public string origin { get; set; }

        public string url { get; set; }

        public string data { get; set; }

        public Dictionary<string, string> files { get; set; }
    }
}

6
RestSharp और JSON.NET निश्चित रूप से जाने का रास्ता है। मुझे एमएस टूलसेट की कमी और असफल होने की संभावना मिली।
13

2
RestSharp के लिए एक और वोट क्योंकि आप इसे WebApi क्लाइंट पुस्तकालयों की तुलना में बहुत अधिक आसानी से परीक्षण के लिए मज़ाक कर सकते हैं।
रोब चर्च

1
मोनो उपयोगकर्ताओं के लिए - RestSharp System.Net WebRequest apis का उपयोग कर रहा है - जो, मेरे अनुभव में .net कार्यान्वयन के रूप में विश्वसनीय नहीं है। ('यादृच्छिक' लटके)
टॉम

3
कृपया इस उत्तर में एक उदाहरण देना अच्छा होगा।
कलस्टर

2
एक उदाहरण की कमी इस पोस्ट को उपयोगी नहीं बनाती है!
smac2020

39

असंबंधित, मुझे यकीन है, लेकिन उचित निपटान सुनिश्चित करने के लिए ब्लॉकों IDisposableमें अपनी वस्तुओं को लपेटें using:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Web;
using System.Net;
using System.IO;

namespace ConsoleProgram
{
    public class Class1
    {
        private const string URL = "https://sub.domain.com/objects.json?api_key=123";
        private const string DATA = @"{""object"":{""name"":""Name""}}";

        static void Main(string[] args)
        {
            Class1.CreateObject();
        }

        private static void CreateObject()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
            request.Method = "POST";
            request.ContentType = "application/json";
            request.ContentLength = DATA.Length;
            using (Stream webStream = request.GetRequestStream())
            using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
            {
                requestWriter.Write(DATA);
            }

            try
            {
                WebResponse webResponse = request.GetResponse();
                using (Stream webStream = webResponse.GetResponseStream() ?? Stream.Null)
                using (StreamReader responseReader = new StreamReader(webStream))
                {
                    string response = responseReader.ReadToEnd();
                    Console.Out.WriteLine(response);
                }
            }
            catch (Exception e)
            {
                Console.Out.WriteLine("-----------------");
                Console.Out.WriteLine(e.Message);
            }

        }
    }
}

4
अच्छा जवाब जो नियमित .NET वातावरण के बाहर किसी भी अतिरिक्त पैकेज का उपयोग नहीं करता है।
पालस्विम

@ जेसे सी। स्लीकर..क्यों मैंने WebResponse webResponse = request.GetResponse () में 404 त्रुटि की;
गोह हान

2
क्योंकि संसाधन नहीं मिला? 404 पाने के कई कारण हैं

1
यह एक शानदार समाधान है @ जेसीसी। स्लाइसर। मैं टोकन खींचने के लिए इस कोड को लागू करने में सक्षम हूं और इसे कंसोल से देख सकता हूं। क्या आपके पास मेरे लिए कोई सुझाव है कि अब इस टोकन को प्रमाणीकरण / लॉगिन के लिए उपयोग करें? मैं कुछ डेटा खींचने के लिए GET का उपयोग करना चाहता हूं, लेकिन केवल तभी जब मैं लॉग इन हूं। मैं इस बारे में और अधिक कहां जान सकता हूं? धन्यवाद!
पॉल लगुना

18

C # में एक बाहरी API को कॉल करने के कुछ अलग तरीके हैं (अपडेट 2019)।

.NET के अंतर्निहित तरीके:

  • WebRequest & WebClient - क्रिया एपीआई और माइक्रोसॉफ्ट के प्रलेखन का पालन करना बहुत आसान नहीं है
  • HttpClient - ब्लॉक का सबसे नया बच्चा।

नि: शुल्क, ओपन-सोर्स नुगेट पैकेज , जो स्पष्ट रूप से .NET के क्लाइंट में निर्मित डेवलपर की तुलना में बहुत बेहतर डेवलपर अनुभव है:

  • ServiceStack.Text (1k github stars, 7m Nuget डाउनलोड) (*) - तेज, हल्का और लचीला।
  • RestSharp (6k github सितारे, 23m Nuget डाउनलोड) (*) - साधारण REST और HTTP API क्लाइंट
  • फ्लुरल (1.7k github सितारे, 3m नुगेट डाउनलोड) (*) - एक धाराप्रवाह, पोर्टेबल, परीक्षण योग्य HTTP वेब लाइब्रेरी

उपरोक्त सभी पैकेज एक महान डेवलपर अनुभव प्रदान करते हैं (यानी संक्षिप्त, आसान एपीआई) और अच्छी तरह से बनाए रखा जाता है।

(*) अगस्त 2019 तक

उदाहरण: ServiceStack.Text का उपयोग करके एक फेक रेस्ट एपीआई से एक टोडो आइटम प्राप्त करना। अन्य पुस्तकालयों में बहुत समान वाक्यविन्यास है।

class Program
{
    static void Main(string[] args)
    {
        // fake rest API
        string url = "https://jsonplaceholder.typicode.com/todos/1";

        // GET data from api & map to Poco
        var todo =  url.GetJsonFromUrl().FromJson<Todo>();

        // print result to screen
        todo.PrintDump();
    }
    public class Todo
    {
        public int UserId { get; set; }
        public int Id { get; set; }
        public string Title { get; set; }
        public bool Completed { get; set; }
    }

}

.NET कोर कंसोल ऐप में उपरोक्त उदाहरण चलाना, निम्नलिखित आउटपुट का उत्पादन करता है।

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

NuGet का उपयोग करके इन पैकेजों को स्थापित करें

Install-Package ServiceStack.Text, or

Install-Package RestSharp, or

Install-Package Flurl.Http

17

कृपया अपने REST एपीआई अनुरोध के लिए नीचे दिए गए कोड का उपयोग करें

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Json;

namespace ConsoleApplication2
{
    class Program
    {
        private const string URL = "https://XXXX/rest/api/2/component";
        private const string DATA = @"{
    ""name"": ""Component 2"",
    ""description"": ""This is a JIRA component"",
    ""leadUserName"": ""xx"",
    ""assigneeType"": ""PROJECT_LEAD"",
    ""isAssigneeTypeValid"": false,
    ""project"": ""TP""}";

        static void Main(string[] args)
        {
            AddComponent();
        }

        private static void AddComponent()
        {
            System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
            client.BaseAddress = new System.Uri(URL);
            byte[] cred = UTF8Encoding.UTF8.GetBytes("username:password");
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(cred));
            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

            System.Net.Http.HttpContent content = new StringContent(DATA, UTF8Encoding.UTF8, "application/json");
            HttpResponseMessage messge = client.PostAsync(URL, content).Result;
            string description = string.Empty;
            if (messge.IsSuccessStatusCode)
            {
                string result = messge.Content.ReadAsStringAsync().Result;
                description = result;
            }
        }
    }
}

-1: .net एक प्रबंधित प्लेटफ़ॉर्म है, लेकिन HttpClient अप्रबंधित है (इसका मतलब यह बताने के लिए कि आप इसका इस्तेमाल नहीं कर सकते हैं जब यह उन मानव रहित बिंदुओं का निपटान कर सकता है)। इसके बिना, आपका कोड उपयोगकर्ताओं के एक जोड़े के लिए पैमाना नहीं होगा (और, हाँ, यह आईएस महत्वपूर्ण है, इतना महत्वपूर्ण है कि भाषा के पास इससे निपटने के लिए एक विशिष्ट कीवर्ड है)।
JCKödel

5
@ JCKödel - आप यहां बिल्कुल ठीक नहीं हैं और आपको इस stackoverflow.com/a/22561368 को पढ़ना चाहिए - HttpClient को कई कॉल के लिए फिर से इस्तेमाल करने के लिए डिज़ाइन किया गया है
hB0

1
हाँ @ JCKödel कृपया इस लेख को पढ़ें stackoverflow.com/questions/15705092/…
Nathan

11

मैं ASP.NET कोर में अपना समाधान साझा करना चाहूंगा

using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;

namespace WebApp
{
    public static class HttpHelper
    {
        // In my case this is https://localhost:44366/
        private static readonly string apiBasicUri = ConfigurationManager.AppSettings["apiBasicUri"];

        public static async Task Post<T>(string url, T contentValue)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(apiBasicUri);
                var content = new StringContent(JsonConvert.SerializeObject(contentValue), Encoding.UTF8, "application/json");
                var result = await client.PostAsync(url, content);
                result.EnsureSuccessStatusCode();
            }
        }

        public static async Task Put<T>(string url, T stringValue)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(apiBasicUri);
                var content = new StringContent(JsonConvert.SerializeObject(stringValue), Encoding.UTF8, "application/json");
                var result = await client.PutAsync(url, content);
                result.EnsureSuccessStatusCode();
            }
        }

        public static async Task<T> Get<T>(string url)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(apiBasicUri);
                var result = await client.GetAsync(url);
                result.EnsureSuccessStatusCode();
                string resultContentString = await result.Content.ReadAsStringAsync();
                T resultContent = JsonConvert.DeserializeObject<T>(resultContentString);
                return resultContent;
            }
        }

        public static async Task Delete(string url)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(apiBasicUri);
                var result = await client.DeleteAsync(url);
                result.EnsureSuccessStatusCode();
            }
        }
    }
}

इस तरह से कुछ पोस्ट करने के लिए:

await HttpHelper.Post<Setting>($"/api/values/{id}", setting);

हटाने के लिए उदाहरण:

await HttpHelper.Delete($"/api/values/{id}");

सूची प्राप्त करने के लिए उदाहरण:

List<ClaimTerm> claimTerms = await HttpHelper.Get<List<ClaimTerm>>("/api/values/");

उदाहरण केवल एक पाने के लिए:

ClaimTerm processedClaimImage = await HttpHelper.Get<ClaimTerm>($"/api/values/{id}");

2
यह वास्तव में एक अच्छा सा कोड है, हालांकि आपको एक ब्लॉक के अंदर httpclient का उपयोग नहीं करना चाहिए। देख aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
माइक काले

9

.NET 4.5 या .NET कोर का उपयोग करते समय REST API को कॉल करने के लिए अपडेट करें

मैं सुझाव दूंगा DalSoft.RestClient (कैविएट मैंने इसे बनाया)। इसका कारण यह है कि यह डायनेमिक टाइपिंग का उपयोग करता है आप सब कुछ एक धाराप्रवाह कॉल में शामिल कर सकते हैं जिसमें क्रमांकन / डी-क्रमांकन शामिल है। नीचे एक कार्यशील उदाहरण है:

dynamic client = new RestClient("http://jsonplaceholder.typicode.com");

var post = new Post { title = "foo", body = "bar", userId = 10 };

var result = await client.Posts(1).Put(post);

5

प्राप्त:

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

    return model;
}

पद:

// 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()) {
            // got response
            length = response.ContentLength;
        }
    } catch (WebException ex) {
        WebResponse errorResponse = ex.Response;
        using(Stream responseStream = errorResponse.GetResponseStream()) {
            StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
            String errorText = reader.ReadToEnd();
            // log errorText
        }
        throw;
    }
}

नोट: धारावाहिक और वर्णन करने के लिए JSON मैं Newtonsoft.Json NuGet पैकेज का उपयोग करता था।


4

.Net से बाकी सेवाओं के लिए कॉल करने के लिए Refit देखें। मुझे इसका उपयोग करना बहुत आसान लगा है: https://github.com/paulcbetts/refit

Refit: .NET कोर, Xamarin और .NET के लिए स्वचालित प्रकार-सुरक्षित REST लाइब्रेरी

Refit एक लाइब्रेरी है जो स्क्वायर के रेट्रोफिट लाइब्रेरी से काफी प्रेरित है, और यह आपके REST API को लाइव इंटरफ़ेस में बदल देता है:

public interface IGitHubApi {
        [Get("/users/{user}")]
        Task<User> GetUser(string user); } The RestService class generates an implementation of IGitHubApi that uses HttpClient to make its calls:

var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com");

var octocat = await gitHubApi.GetUser("octocat");

क्या आप जानते हैं कि अगर रिफिट इसे प्राप्त करने के लिए प्रतिबिंब का उपयोग करता है? मुझे जानकारी कहीं भी नहीं मिल रही है।
tfrascaroli

क्षमा करें @tfrascaroli मुझे यकीन नहीं है हाथ से।
पेट्रिकबैडली

2

यह एक उदाहरण कोड है जो निश्चित रूप से काम करता है। रेस्ट सर्विस से ऑब्जेक्ट का एक सेट पढ़ने के लिए इसे बनाने में मुझे एक दिन लगा:

रूटऑबजेक्ट बाकी सेवा से ऑब्जेक्ट इम पढ़ने का प्रकार है।

string url = @"http://restcountries.eu/rest/v1";
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(IEnumerable<RootObject>));
WebClient syncClient = new WebClient();
string content = syncClient.DownloadString(url);

using (MemoryStream memo = new MemoryStream(Encoding.Unicode.GetBytes(content)))
{
    IEnumerable<RootObject> countries = (IEnumerable<RootObject>)serializer.ReadObject(memo);    
}

Console.Read();

1
    var TakingRequset = WebRequest.Create("http://xxx.acv.com/MethodName/Get");
    TakingRequset.Method = "POST";
    TakingRequset.ContentType = "text/xml;charset=utf-8";
    TakingRequset.PreAuthenticate = true;

    //---Serving Request path query
     var PAQ = TakingRequset.RequestUri.PathAndQuery;

    //---creating your xml as per the host reqirement
    string xmlroot=@"<root><childnodes>passing parameters</childnodes></root>";
    string xmlroot2=@"<root><childnodes>passing parameters</childnodes></root>";

    //---Adding Headers as requested by host 
    xmlroot2 = (xmlroot2 + "XXX---");
    //---Adding Headers Value as requested by host 
  //  var RequestheaderVales = Method(xmlroot2);

    WebProxy proxy = new WebProxy("XXXXX-----llll", 8080);
    proxy.Credentials = new NetworkCredential("XXX---uuuu", "XXX----", "XXXX----");
    System.Net.WebRequest.DefaultWebProxy = proxy;


    // Adding The Request into Headers
    TakingRequset.Headers.Add("xxx", "Any Request Variable ");
    TakingRequset.Headers.Add("xxx", "Any Request Variable");

    byte[] byteData = Encoding.UTF8.GetBytes(xmlroot);
    TakingRequset.ContentLength = byteData.Length;

    using (Stream postStream = TakingRequset.GetRequestStream())
    {
        postStream.Write(byteData, 0, byteData.Length);
        postStream.Close();
    }



    StreamReader stredr = new StreamReader(TakingRequset.GetResponse().GetResponseStream());
    string response = stredr.ReadToEnd();

1

मैंने इसे वेब एपी 2.0 के साथ इस सरल तरीके से किया। आप UseDefaultCredentials.I को अपने उपयोग के मामलों के लिए उपयोग कर सकते हैं।

            List<YourObject> listObjects = new List<YourObject>();


            string response = "";
            using (var client = new WebClient() { UseDefaultCredentials = true })
            {
                 response = client.DownloadString(apiUrl);
            }

            listObjects = JsonConvert.DeserializeObject<List<YourObject>>(response);
            return listObjects ;

0

चूंकि आप विज़ुअल स्टूडियो 11 बीटा का उपयोग कर रहे हैं, आप नवीनतम और महानतम का उपयोग करना चाहेंगे। नई वेब एप में इसके लिए कक्षाएं हैं।

HttpClient देखें: http://wcf.codeplex.com/wikipage?title=WCF%20HTTP


0

यहाँ चिह्नित उत्तर सीधे HttpClient का उपयोग करने और इसे निपटाने का सुझाव देता है। यह काम कर सकता है, लेकिन यदि आप इसे सही तरीके से उपयोग नहीं करते हैं तो HttpClient के साथ समस्याओं को चलाना काफी आसान है। यदि आप HttpClient का उपयोग करने जा रहे हैं, तो आप कारखाने के पैटर्न का उपयोग करने वाले 3rd पार्टी लाइब्रेरी को HttpClients के निर्माण / निपटान को सौंपने से बेहतर हैं। RestClient.Net एक ऐसी लाइब्रेरी है।

यह एक बहुत ही मूल HttpClient कारखाने के साथ आता है ताकि आप सॉकेट थकावट समस्या के लिए न चलें,

public class DefaultHttpClientFactory : IHttpClientFactory, IDisposable
{
    #region Fields
    private bool disposed;
    private readonly ConcurrentDictionary<string, Lazy<HttpClient>> _httpClients;
    private readonly Func<string, Lazy<HttpClient>> _createClientFunc;
    #endregion

    #region Constructor
    public DefaultHttpClientFactory() : this(null)
    {
    }

    public DefaultHttpClientFactory(Func<string, Lazy<HttpClient>> createClientFunc)
    {
        _createClientFunc = createClientFunc;
        _httpClients = new ConcurrentDictionary<string, Lazy<HttpClient>>();

        if (_createClientFunc != null) return;
        _createClientFunc = name =>
        {
            return new Lazy<HttpClient>(() => new HttpClient(), LazyThreadSafetyMode.ExecutionAndPublication);
        };
    }
    #endregion

    #region Implementation
    public HttpClient CreateClient(string name)
    {
        if (name == null)
        {
            throw new ArgumentNullException(nameof(name));
        }

        return _httpClients.GetOrAdd(name, _createClientFunc).Value;
    }

    public void Dispose()
    {
        if (disposed) return;
        disposed = true;

        foreach (var name in _httpClients.Keys)
        {
            _httpClients[name].Value.Dispose();
        }
    }
    #endregion
}

लेकिन Microsoft के IHttpClientFactory कार्यान्वयन को नवीनतम और महानतम के लिए भी उपयोग किया जा सकता है:

    var serviceCollection = new ServiceCollection();
    var baseUri = new Uri("http://www.test.com");
    serviceCollection.AddSingleton(typeof(ISerializationAdapter), typeof(NewtonsoftSerializationAdapter));
    serviceCollection.AddSingleton(typeof(ILogger), typeof(ConsoleLogger));
    serviceCollection.AddSingleton(typeof(IClient), typeof(Client));
    serviceCollection.AddDependencyInjectionMapping();
    serviceCollection.AddTransient<TestHandler>();

    //Make sure the HttpClient is named the same as the Rest Client
    serviceCollection.AddSingleton<IClient>(x => new Client(name: clientName, httpClientFactory: x.GetRequiredService<IHttpClientFactory>()));
    serviceCollection.AddHttpClient(clientName, (c) => { c.BaseAddress = baseUri; })
        .AddHttpMessageHandler<TestHandler>();

    var serviceProvider = serviceCollection.BuildServiceProvider();
    var client = serviceProvider.GetService<IClient>();
    await client.GetAsync<object>();

RestClient.Net निर्भरता इंजेक्शन, मॉकिंग, IoC कंटेनर, यूनिट परीक्षण क्षमता को ध्यान में रखता है, और इसके बाद के संस्करण तेजी से है। मैं चारों ओर शिकार किया है और एक ही क्षमता में काम करने के लिए लगता है कि केवल अन्य ग्राहक Flurl.Http है


-2

पहला कदम http क्लाइंट के लिए सहायक वर्ग बनाता है।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace callApi.Helpers
{
    public class CallApi
    {
        private readonly Uri BaseUrlUri;
        private HttpClient client = new HttpClient();

        public CallApi(string baseUrl)
        {
            BaseUrlUri = new Uri(baseUrl);
            client.BaseAddress = BaseUrlUri;
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

        }

        public HttpClient getClient()
        {
            return client;
        }

        public HttpClient getClientWithBearer(string token)
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            return client;
        }

    }
}

तब आप अपने कोड में इस वर्ग का उपयोग कर सकते हैं।

यह एक उदाहरण है कि कैसे आप उपरोक्त वर्ग का उपयोग किए बिना बाकी एप को कॉल करते हैं।

// GET api/values
[HttpGet]
public async Task<ActionResult<string>> postNoBearerAsync(string email, string password,string baseUrl, string action)
{
    var request = new LoginRequest
    {
        email = email,
        password = password
    };

    var callApi = new CallApi(baseUrl);
    var client = callApi.getClient();
    HttpResponseMessage response = await client.PostAsJsonAsync(action, request);
    if (response.IsSuccessStatusCode)
        return Ok(await response.Content.ReadAsAsync<string>());
    else
        return NotFound();
}

यह एक उदाहरण है कि आप बाकी एप को कैसे कॉल कर सकते हैं जिसमें वाहक की आवश्यकता होती है।

// GET api/values
[HttpGet]
public async Task<ActionResult<string>> getUseBearerAsync(string token, string baseUrl, string action)
{
    var callApi = new CallApi(baseUrl);
    var client = callApi.getClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    HttpResponseMessage response = await client.GetAsync(action);
    if (response.IsSuccessStatusCode)
    {
        return Ok(await response.Content.ReadAsStringAsync());

    }
    else
        return NotFound();
}

आप नीचे दिए गए रेपो को भी संदर्भित कर सकते हैं यदि आप इसका उदाहरण देखना चाहते हैं कि यह कैसे काम करता है।

https://github.com/mokh223/callApi

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