আমি কীভাবে সি # ব্যবহার করে একটি রেস্ট এপিআইতে কল করব?


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) বার্তা পাই But তবে আমি কনসোলটি দেখতে পাচ্ছি না utআউট লাইনগুলি আমি ক্যাচ ব্লকে রেখেছি।

আমার কনসোল:

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 বিটা ব্যবহার করছি।


এছাড়াও, আপনি কি সেখানে ব্রেক পয়েন্ট রেখেছেন তা দেখতে যেখানে ঠিক, এটি ফুঁকছে?
নটম

এটি আউটপুট উইন্ডো থেকে ফলাফল তবে কনসোল নয়
Serj-Tm

5
এমএসডিএন-এর রেস্টস্টুল সার্ভিসগুলি নির্মাণের জন্য একটি চমৎকার নিবন্ধ ছিল: এমএসডিএন.এমক্রিফ্টস / লিবেরি / ডিডি 203052.aspx ... এবং আরএসএসএল ক্লায়েন্ট: এমএসডিএন.মাইক্রোসফটকম /en-us/magazine/ee309509.aspx
লিন ক্র্যাম্বলিং

@ ক্রিসলাইভলি আইইয়ের সাথে এর কী সম্পর্ক আছে? = \ এটি অনুরোধটি ফুরিয়েছে etGetResponse লাইন।
নালভক্সপপুলি

@TheLindyHop; একেবারে কিছুই না. আমি ভুল পড়া।
NotMe

উত্তর:


427

এএসপি.নেট ওয়েব এপিআই পূর্বে উল্লিখিত ডাব্লুসিএফ ওয়েব এপিআই প্রতিস্থাপন করেছে।

আমি ভেবেছিলাম যে আমি একটি আপডেট হওয়া উত্তর পোস্ট করব যেহেতু এই প্রতিক্রিয়াগুলির বেশিরভাগই ২০১২ সালের শুরুর দিক থেকে, এবং "কল রিস্টাল সার্ভিস সি #" এর জন্য গুগল অনুসন্ধান করার সময় এই থ্রেড শীর্ষ ফলাফলগুলির মধ্যে একটি।

মাইক্রোসফ্টের বর্তমান দিকনির্দেশনা হ'ল একটি এসইএসএফুল সার্ভিস গ্রাহ্য করার জন্য মাইক্রোসফ্ট এএসপি.নেট ওয়েব এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করা। এটি একটি নুগেট প্যাকেজ, মাইক্রোসফ্ট.এস্পনেট.ওয়েবএপি.স্লিভ হিসাবে উপলব্ধ। আপনার সমাধানে আপনাকে এই নিউগেট প্যাকেজটি যুক্ত করতে হবে।

এএসপি. নেট ওয়েব এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আপনার উদাহরণটি কীভাবে প্রদর্শিত হবে তা এখানে:

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 উদাহরণটি পুনরায় ব্যবহার করা উচিত। এই ক্ষেত্রে এইচটিটিপিপ্লাইন্ট উদাহরণে ব্যবহারের বিবৃতি কেন ব্যবহার করা হয়নি সে সম্পর্কে আরও তথ্যের জন্য এই প্রশ্ন এবং এর উত্তরগুলি দেখুন: এইচটিটিপিপ্লাইয়েন্ট এবং এইচটিপিপিপ্লায়েন্টহ্যান্ডলারকে কী নিষ্পত্তি করতে হবে?

অন্যান্য উদাহরণ সহ আরও তথ্যের জন্য, এখানে যান: 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
ধন্যবাদ! আমার জন্য কাজ করার জন্য আমার ওয়েবএপি ক্লায়েন্ট নুগেট প্যাকেজটি ইনস্টল করা দরকার: ইনস্টল-প্যাকেজ মাইক্রোসফ্ট.এএসপনেট.ওয়েবএপি.স্লিভ
ইভ।

3
ক্লায়েন্ট লাইব্রেরি সহ আপনার যদি আপনার আরএসইটি ইন্টিগ্রেশনকে উপহাস করার দরকার হয় তবে এটি এখনও সহজ নয়। রেস্টশার্প চেষ্টা করে দেখুন?
রব চার্চ

6
এই উত্তরটি ইতিমধ্যে যেভাবে করা হয়েছে তার থেকে আরও সুন্দর করার জন্য, আপনার সংস্থানটি আরও ভালভাবে পরিচালনা করার জন্য আপনার এইচটিটিপি ক্লায়েন্ট ঘোষণাকে একটি ব্যবহারের বিবৃতিতে আবদ্ধ করতে হবে :)
ড্যানিয়েল সিবার্ট

7
ব্যবহারের চেষ্টা করা হয়েছিল কিন্তু ReadAsAncnc () ব্যবহার করতে অক্ষম, ত্রুটি পেয়ে "HttpContent 'ReadAsAsync' এর সংজ্ঞা এবং কোনও এক্সটেনশন পদ্ধতি নেই
রবার্ট গ্রিন এমবিএ

7
@ রবার্টগ্রিন এমবিএ: এক্সটেনশন পদ্ধতিটি পেতে ReadAsAsync(), একটি রেফারেন্স যুক্ত করুন System.Net.Http.Formatting.dll। (স্বজ্ঞাত, তাই না?)
অরিন

122

আমার পরামর্শটি রেস্টশার্প ব্যবহার করা হবে । আপনি আরএসটি পরিষেবাগুলিতে কল করতে পারেন এবং প্রতিক্রিয়াটির মাধ্যমে পার্স করতে হলে খুব কম বয়লারপ্লেট কোড সহ পোকো অবজেক্টগুলিতে তাদের কাস্ট করতে পারেন। এটি আপনার নির্দিষ্ট ত্রুটিটি সমাধান করবে না, তবে কীভাবে আরইএসটি পরিষেবাগুলিতে কল করা যায় তার সামগ্রিক প্রশ্নের উত্তর দেয়। আপনার কোডটি ব্যবহার করার জন্য এটি পরিবর্তন করার কারণে ব্যবহারের স্বাচ্ছন্দ্য এবং দৃust়তা এগিয়ে চলেছে should যদিও এটি আমার 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
রেস্টশার্প এবং জেএসএন.এনইট অবশ্যই যাওয়ার উপায়। আমি এমএস টুলসেটের অভাব পেয়েছি এবং ব্যর্থ হওয়ার সম্ভাবনা পেয়েছি।
সিবুতেউ

2
রেস্টশার্পের জন্য আর একটি ভোট কারণ আপনি এটি ওয়েবএপি ক্লায়েন্ট লাইব্রেরির চেয়ে অনেক সহজে পরীক্ষার জন্য উপহাস করতে পারেন।
রব চার্চ

1
মনো ব্যবহারকারীদের জন্য - রেস্টশার্পটি সিস্টেম. নেট নেটআরকোয়েস্ট এপিআইএস ব্যবহার করছে বলে মনে হচ্ছে - যা আমার অভিজ্ঞতায়। নেট প্রয়োগের মতো নির্ভরযোগ্য নয়। ('এলোমেলো' স্তব্ধ)
টম

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
ভাল উত্তর যা নিয়মিত। নেট পরিবেশের বাইরে কোনও অতিরিক্ত প্যাকেজ ব্যবহার করে না।
পালসউইম

@ জেসি সি.স্লাইজার..আমি কেন ওয়েবরেসপনস ওয়েবরেসপনস = অনুরোধে 404 ত্রুটি মারি? অনুরোধ.গেটরেস্পোনস ();
গোহ হান

2
কারণ রিসোর্স পাওয়া গেল না? 404 পাওয়ার অনেকগুলি কারণ রয়েছে
জেসি সি স্লিকার

1
এটি @ জেসিসি.স্লাইকার একটি দুর্দান্ত সমাধান। টোকেন টানতে এবং কনসোল থেকে এটি দেখতে আমি এই কোডটি প্রয়োগ করতে সক্ষম। আমার কাছে এখন প্রমাণীকরণ / লগইনের জন্য এই টোকেনটি নেওয়ার জন্য কোনও টিপস রয়েছে কি? আমি কিছু ডেটা টানতে জিইটি ব্যবহার করতে চাই, তবে আমি লগ ইন করলেই পারতাম this আমি এই বিষয়ে আরও কোথায় জানতে পারি? ধন্যবাদ!
পল লাগুনা

1
এটি আমার পক্ষে কাজ করেছে। ধন্যবাদ!
শাহরিয়ার রহমান জহিন

18

সি # (আপডেট হওয়া 2019) এ বাহ্যিক এপিআই কল করার কয়েকটি ভিন্ন উপায়।

। নেট এর অন্তর্নির্মিত উপায়:

নিখরচায়, ওপেন সোর্স নুগেট প্যাকেজগুলি , যা ক্লায়েন্টে তৈরি নেট নেট-র তুলনায় স্পষ্টভাবে অনেক ভাল বিকাশকারী অভিজ্ঞতা রয়েছে:

  • সার্ভিস স্ট্যাক.সেক্সট (১ কে গিথুব তারা, m মি নুগেট ডাউনলোড) (*) - দ্রুত, হালকা এবং স্থিতিস্থাপক।
  • রেস্টশার্প (6 কে গিথুব তারা, 23 মি নিউট ডাউনলোড) (*) - সাধারণ REST এবং HTTP API ক্লায়েন্ট
  • ফ্লারল (1.7 কে গিথুব তারা, 3 মি নিউজ ডাউনলোড) (*) - একটি সাবলীল, পোর্টেবল, টেস্টেবল এইচটিটিপি ক্লায়েন্ট লাইব্রেরি

উপরের সমস্ত প্যাকেজগুলি দুর্দান্ত বিকাশকারী অভিজ্ঞতা প্রদান করে (যেমন সংক্ষিপ্ত, সহজ এপিআই) এবং ভালভাবে বজায় থাকে।

(*) আগস্ট 2019 হিসাবে

উদাহরণ: সার্ভিস স্ট্যাক.টেক্সট ব্যবহার করে একটি ফেক রেস্ট এপিআই থেকে টোডো আইটেম পাওয়া। অন্যান্য লাইব্রেরিতে খুব অনুরূপ বাক্য গঠন রয়েছে।

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 কোর কনসোল অ্যাপে উপরোক্ত উদাহরণটি চালনা করে নিম্নলিখিত আউটপুট উত্পাদন করা হয়।

এখানে চিত্র বর্ণনা লিখুন

নিউগেট ব্যবহার করে এই প্যাকেজগুলি ইনস্টল করুন

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

-১:। নেট একটি পরিচালিত প্ল্যাটফর্ম, তবে এইচটিপিপি্লিয়েন্টটি নিয়ন্ত্রণহীন (যার অর্থ আপনি যখন এটি নিয়ন্ত্রণহীন পয়েন্টারগুলি নিষ্পত্তি করতে পারেন তখন এটি জানাতে ব্যবহার করা উচিত)। এটি ব্যতীত আপনার কোড কয়েকজন ব্যবহারকারীর কাছে স্কেল করবে না (এবং, হ্যাঁ, এটি গুরুত্বপূর্ণ, ভাষাটি এর সাথে মোকাবেলা করার জন্য একটি নির্দিষ্ট কীওয়ার্ড রয়েছে) তাই এটি গুরুত্বপূর্ণ।
জেসি কেডেল

5
@ JCKödel - তুমি একদম ঠিক এখানে নও এবং এই পড়া উচিত stackoverflow.com/a/22561368 একাধিক কলের জন্য ব্যবহৃত পুনরায় HttpClient হিসাবে তৈরি করা হয়েছে করা হয়েছে -
hB0

1
হ্যাঁ @ JCKödel দয়া করে এই নিবন্ধ পড়া stackoverflow.com/questions/15705092/...
নাথন

11

আমি আমার সমাধানটি এএসপি.নেট কোরে ভাগ করতে চাই

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 এপিআই কল করার জন্য আপডেট করুন

আমি সুপারিশ করবে 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;
    }
}

দ্রষ্টব্য: জেএসওএনকে সিরিয়ালাইজ করতে ও পছন্দসই করতে আমি নিউটনসফট.জসন নিউগেট প্যাকেজটি ব্যবহার করেছি।


4

নেট থেকে বিশ্রাম পরিষেবাতে কল করার জন্য রিফিট পরীক্ষা করে দেখুন। আমি এটি ব্যবহার করা খুব সহজ খুঁজে পেয়েছি: https://github.com/paulcbetts/refit

রিফিট:। নেট কোর, জামারিন এবং .NET এর জন্য স্বয়ংক্রিয় টাইপ-নিরাপদ REST গ্রন্থাগার

স্ক্রিটের রেট্রোফিট লাইব্রেরি থেকে রিফিটটি ভারীভাবে অনুপ্রাণিত একটি লাইব্রেরি এবং এটি আপনার আরএসটি এপিআইকে একটি লাইভ ইন্টারফেসে রূপান্তরিত করে:

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

ওয়েব এপিআই ২.০ সহ আমি এই সহজ উপায়ে এটি করেছি। আপনি UseDefaultCredentials অপসারণ করতে পারেন। আমি এটি আমার নিজের ব্যবহারের ক্ষেত্রে ব্যবহার করেছি।

            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 বিটা ব্যবহার করছেন আপনি সর্বশেষতম এবং দুর্দান্ত ব্যবহার করতে চাইবেন। নতুন ওয়েব অপি এর জন্য ক্লাস রয়েছে।

এইচটিটিপিসিলেট দেখুন: http://wcf.codeplex.com/wikipage?title=WCF%20HTTP


0

এখানে চিহ্নিত উত্তরটি HTTPClient সরাসরি ব্যবহার এবং এটি নিষ্পত্তি করার পরামর্শ দেয়। এটি কার্যকর হতে পারে তবে আপনি যদি এটি সঠিকভাবে ব্যবহার না করেন তবে এইচটিটিপিপ্লিনেন্টের সমস্যাগুলির মধ্যে চলে আসা বেশ সহজ । আপনি যদি এইচটিটিপি ক্লিনেন্ট ব্যবহার করতে চলেছেন তবে আপনি ফ্যাক্টরি প্যাটার্ন ব্যবহার করে এমন একটি তৃতীয় পক্ষের লাইব্রেরিতে এইচটিপিপিলেটস তৈরি / নিষ্পত্তি হস্তান্তর করার চেয়ে ভাল। রেস্টক্লিয়েন্ট.নেট এমন একটি লাইব্রেরি।

এটি একটি খুব বেসিক 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
}

তবে মাইক্রোসফ্টের আইএইচটিপিপ্লায়েন্টফ্যাক্টরি বাস্তবায়ন সর্বশেষ এবং সর্বকালের জন্যও ব্যবহার করা যেতে পারে:

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

রেস্টক্লিয়েন্ট.নেট নির্ভরতা ইনজেকশন, উপহাস, আইওসি পাত্রে, ইউনিট টেস্টিবিলিটির অ্যাকাউন্টে নেয় এবং সর্বোপরি দ্রুত। আমি চারপাশে শিকার করেছি এবং কেবলমাত্র অন্য ক্লায়েন্ট যা একই ধরণের ক্ষমতার সাথে কাজ করে বলে মনে হচ্ছে এটি হ'ল ফ্লুর.এইচটিটিপি


-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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.