با پیشرفتن در مسیر توسعه وب، احتمالا دیر یا زود نیاز به استفاده از API خواهید داشت. در این مقاله، هدفم اینه که فهرست جامع ترین شیوه های استفاده از API های RESTful در پروژه های سی شارپ شما را نشان دهم و اینکه چگونه این کار را در برخی از نمونه های ساده انجام دهید. پس از خواندن مقاله، بینش کامل تری در مورد گزینه هایی که برای شما در اختیار شما قرار می گیرد و می توانید بهترین روش را برای کار با API RESTful استفاده کنید.

RESTful API چیست؟

قبل از شروع، شما ممکن است بپرسید که API چیست، و در مورد بخش RESTful چیست؟

به عبارت ساده، API ها لایه های بین برنامه های کاربردی نرم افزاری هستند. شما می توانید درخواست را به API ارسال کنید و پاسخ دریافت کنید. هدف از API ها، پنهان کردن تمام جزئیات یک نرم افزار از دید استفاده کننده آن است .

کل اینترنت یک شبکه بزرگ از API هایی است که به شما خدمات می دهند. ما از API ها برای برقراری ارتباط و ارتباط اطلاعات بین برنامه ها استفاده می کنیم. در حال حاضر تقریبا برای هر چیزی API وجود دارد. اکثر خدماتی که شما هر روز استفاده می کنید دارای API های خاص خود هستند (GoogleMaps، فیس بوک، توییتر، نمایش مشخصات عمومی، پورتال های آب و هوا …)

RESTful به این معنی است که API مطابق با اصول و قواعد REST (Representative State Transfer) که اساس اصلی معماری وب است، اجرا می شود. API های RESTful در بیشتر موارد متن ساده، JSON یا پاسخ XML را باز می گردانند.

برای خواندن مطالب کانل در مورد RESTful API به بخش آموزش برنامه نویسی RESTful API در پی اچ پی مراجعه کنید.

چگونه API های RESTful را استفاده کنیم؟

چندین روش برای استفاده از API RESTful در C # وجود دارد:

  • کلاس HttpWebRequest/Response 
  • کلاس WebClient
  • کلاس HttpClient
  • بسته RestSharp NuGet
  • ServiceStack Http Utils

هر یک از اینها دارای مزایا و معایب است، بنابراین اجازه دهید ما از طریق آنها برویم و آنچه را که ارائه می دهیم ببینیم.

کلاس HttpWebRequest/Response

این پیاده سازی خاص HTTP کلاس WebRequest است که در اصل برای مقابله با درخواست HTTP مورد استفاده قرار گرفته است، اما آن را منسوخ شده و جایگزین کلاس WebClient شد.

کلاس HttpWebRequest کنترل کامل جزئی را بر روی هر جنبه فرآیند درخواست ایجاد می کند. همانطور که می توانید تصور کنید، این می تواند شمشیر دو طرفه باشد و شما به راحتی می توانید از دست دادن مقدار زیادی از زمان تنظیم درخواست های خود را. از سوی دیگر، این ممکن است فقط چیزی است که شما برای مورد خاص خود نیاز دارید.

کلاس HttpWebRequest رابط کاربر را مسدود نمی کند، که من مطمئن هستم که شما با این یکی موافق هستید، بسیار مهم است.

کلاس HttpWebResponse یک ظرف برای پاسخ های ورودی فراهم می کند.

این یک مثال ساده از نحوه مصرف یک API با استفاده از این کلاسهاست.

var request = (HttpWebRequest)WebRequest.Create("https://api.github.com/repos/restsharp/restsharp/releases");
request.Method = "GET";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
var response = (HttpWebResponse)request.GetResponse();
string content = string.Empty;
using (var stream = response.GetResponseStream())
{
using (var sr = new StreamReader(stream))
{
content = sr.ReadToEnd();
}
}
var releases = JArray.Parse(content);

اگر چه این مثال ساده است،اما زمانی که شما نیاز به کار با سناریوهای پیچیده تر مانند ارسال اطلاعات فرم، مجوز و غیره دارید، بسیار پیچیده تر می شود.

کلاس WebClient

این کلاس یک بسته بندی در اطراف HttpWebRequest است. این کلاس فرایند را با انتزاع جزئیات HttpWebRequest از توسعه دهنده ساده می کند. کد آن برای نوشتن ساده تر است و به احتمال زیاد این اشتباهات به این صورت انجام می شود. اگر میخواهید کد کمتری بنویسید، درباره تمام جزئیات نگران نباشید و سرعت اجرای یک غیرفکر است، در نظر بگیرید با استفاده از کلاس WebClient.

این مثال باید به شما نظر ساده ای نسبت به استفاده از WebClient نسبت به روش HttpWebRequest / HttpWebResponse بدهد.

var client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
var response = client.DownloadString("https://api.github.com/repos/restsharp/restsharp/releases");
var releases = JArray.Parse(response);

پس از متد DownloadString، کلاس WebClient یک راهکار دیگر مفید برای ما فراهم می کند. ما می توانیم با استفاده از آن رشته ها، فایل ها یا آرایه های بایتی را دستکاری کنیم و فقط چند میلی ثانیه کمتر از روش HttpWebRequest / HttpWebResponse است.

هر دو کلاس HttpWebRequest / HttpWebResponse و WebClient در نسخه های قدیمی تر از .NET موجود است. مطمئن شوید که MSDN را چک کنید اگر علاقه مند هستید که WebClient دیگر چه چیزی را ارائه دهد.

کلاس HttpClient

HttpClient “بچه جدید در بلوک” است و برخی از ویژگی های مدرن .NET ارائه می دهد که کتابخانه های قدیمی تر انرا ندارند. به عنوان مثال، شما می توانید چندین درخواست را با یک نمونه از HttpClient ارسال کنید، آن را به سرور یا میزبان خاص HTTP متصل نیستید، استفاده از مکانیزم async / wait waiting را می دهد.

شما می توانید در مورد پنج دلیل مهم برای استفاده از HttpClient در این ویدیو بیابید:

  • سرصفحه های کاملا تایپ شده
  • مخفف های مخفی، کوکی ها و اعتبارنامه ها
  • دسترسی به کوکی ها و کوکی های به اشتراک گذاشته شده
  • کنترل ذخیره سازی و ذخیره سازی به اشتراک گذاشته شده را کنترل کنید.
  • ماژول کد خود را به خط لوله ASP.NET تزریق کنید. کد تمیز کننده و مدولار.

در اینجا مثال HttpClient در عمل است:

using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
var response = httpClient.GetStringAsync(new Uri(url)).Result;
var releases = JArray.Parse(response);
}

برای سادگی، من آن را همزمان اجرا کردم. هر روش HttpClient به معنای استفاده ناهمگن است و باید از این روش استفاده شود.

همچنین، من باید یک چیز دیگر را ذکر کنم. بحث وجود دارد که آیا HttpClient باید در یک بلوک استفاده شود یا به صورت ایستا در سطح برنامه باشد. با وجود اینکه IDisposable را اجرا می کند، به نظر می رسد با قرار دادن آن در بلوک استفاده می توانید سوء استفاده از برنامه خود را انجام دهید و SocketException را دریافت کنید. و به عنوان وبلاگ های Ankit، نتایج تست عملکرد بسیار به نفع ابتدایی استاتیک HttpClient است. اطمینان حاصل کنید که این پست های وبلاگ را بخوانید زیرا می توانند به شما در مورد استفاده صحیح از HttpClient آگاهی یابند.

فراموش نکنید که مدرن بودن، HttpClient به دات نت 4.5 منحصر به فرد است، بنابراین شما ممکن است با استفاده از آن در برخی از پروژه های مخرب مشکل داشته باشید.

RestSharp

RestSharp جایگزین OpenSource برای استاندارد کتابخانه های دات نت و یکی از جالب ترین کتابخانه های دات نت است. این بسته به عنوان یک بسته NuGet در دسترس است و چند دلیل برای اینکه شما باید آن را آزمایش کنید وجود دارد.

مانند HttpClient، RestSharp یک کتابخانه مدرن و جامع است، آسان و دلپذیر برای استفاده، در حالی که هنوز با پشتیبانی از نسخه های قدیمی تر از دات نت چارچوب. این دارای مکانیزم Authentication و Serialization / Diserialization است، اما اجازه می دهد تا آنها را با موارد دلخواه خود لغو کنید. این در سراسر سیستم عامل در دسترس است و از OAuth1، OAuth2، Basic، NTLM و پارامترهای تأیید هویت پشتیبانی می کند. شما می توانید هم همزمان و هم ناهمزمان کار کنید. این کتابخانه بسیار بیشتر است و این فقط برخی از مزایای آن است که ارائه می دهد. برای اطلاعات دقیق در مورد استفاده و قابلیت های RestSharp، می توانید از RestSharp در GitHub بازدید کنید.

اکنون سعی کنید لیستی از RestSharp را با استفاده از RestSharp دریافت کنید

var client = new RestClient(url);
IRestResponse response = client.Execute(new RestRequest());
var releases = JArray.Parse(response.Content);

به اندازه کافی ساده اما اجازه ندهید که شما را احمق فرض کنید، RestSharp بسیار انعطاف پذیر است و تمام ابزارهایی را که برای کار با API RESTful نیاز دارید تقریبا هر چیزی را به دست آورید.

یک نکته در این مثال این است که من از مکانیسم deserialization RestSharp استفاده نکردم، به عنوان مثال یک قاعده، که کمی از زباله است، اما شما را تشویق می کنم که از آن استفاده کنید، زیرا واقعا آسان و راحت است. بنابراین شما به راحتی میتوانید یک ظرف مانند این را ایجاد کنید:

public class Release
{
[DeserializeAs(Name = "name")] public string Name { get; set; }
[DeserializeAs(Name = "published_at")] public string PublishedAt { get; set; }
}

و پس از آن از روش Execute استفاده کنید تا به طور مستقیم پاسخ به این کانتینر را از بین ببرید. شما می توانید فقط خواص مورد نیاز خود را اضافه کنید و از Attribute DeserializeAs استفاده کنید تا آنها را به ویژگی های C # (لمس خوب) بسپارید. از آنجا که لیستی از نسخه های ما در پاسخ ما دریافت می کنیم، از فهرست <Release> به عنوان یک نوع حاوی استفاده می کنیم.

var client = new RestClient(url);
var response = client.Execute<List<Release>>(new RestRequest());
var releases = response.Data;

روش بسیار ساده و ظریف برای دریافت اطلاعات ما.

برای RestSharp خیلی بیشتر از ارسال درخواست GET وجود دارد، بنابراین بررسی کنید و ببینید که چقدر خنک می شود.

یک نکته نهایی برای اضافه کردن به مورد RestSharp این است که مخزن آن نیاز به نگهبانان دارد. اگر میخواهید بیشتر در مورد این کتابخانه خبری بدانید، من از شما میخواهم که سرپرستی Reposhop RestSharp و کمک به این پروژه زنده بماند و حتی بهتر شود. شما همچنین می توانید RestSharp را به NETNET Core منتقل کنید.

ServiceStack Http Utils

یک کتابخانه دیگر، اما بر خلاف RestSharp، ServiceStack به نظر می رسد که به درستی نگهداری می شود و با روند مدرن API هماهنگ شده است. فهرست ویژگی های ServiceStack چشمگیر است و قطعا کاربردهای مختلفی دارد.

برای ما در اینجا بیشتر مفید است نشان دادن نحوه مصرف یک API RESTful خارجی است. ServiceStack یک روش تخصصی برای مقابله با API های 3rd Party HTTP به نام Http Utils دارد.

اجازه دهید ما را ببینید که چگونه دریافت خروجی RestSharp به نظر می رسد مانند استفاده از ServiceStack Http Utils ابتدا با استفاده از تجزیه کننده Json.NET.

var response = url.GetJsonFromUrl(requestFilter: webReq =>
{
webReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
});
var releases = JArray.Parse(response);

شما همچنین می توانید آن را به تجزیه کننده ServiceStack بگذارید. ما می توانیم کلاس انتشار که قبل از آن در پست مشخص شده است، استفاده مجدد کنیم.

List<Release> releases = url.GetJsonFromUrl(requestFilter: webReq =>
{
webReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
}).FromJson<List<Release>>();

همانطور که می بینید، هر دو روش درست کار می کنند، و شما می توانید انتخاب کنید که آیا پاسخ رشته دریافت کنید یا آن را بلافاصله deserialize کنید.

اگرچه ServiceStack آخرین کتابخانه ای است که ما آن را تکان دادیم، ما بسیار خوش شانس بودیم که چقدر آسان بود برای استفاده از آن، و من فکر می کنم این ممکن است تبدیل به ابزار من برای برخورد با API ها و خدمات در آینده شود.

گزینه های دیگر

بسیاری از گزینه های دیگر برای مشکلات خاص شما وجود دارد. شما می توانید از هر یک از این کتابخانه ها برای استفاده از یک API RESTful apecific استفاده کنید. به عنوان مثال، octokit.net برای کار با GitHub API به طور خاص استفاده می شود، Facebook SDK برای مصرف فیس بوک API استفاده می شود و بسیاری دیگر برای تقریبا هر چیزی وجود دارد.

در حالی که این کتابخانه ها به طور خاص برای این API ها ساخته شده اند و ممکن است در انجام آنچه آنها برای آنها اهمیت دارد، مفید بودن آنها محدود است، زیرا شما اغلب نیاز به اتصال بیش از یک API در برنامه های خود دارید. این ممکن است باعث پیاده سازی های مختلف برای هر یک و وابستگی های بیشتر شود که به طور بالقوه منجر به تکرار پذیری و خطا می شود. کتابخانه دقیق تر است، انعطاف پذیری کمتری دارد.

نتیجه گیری

بنابراین، به طور خلاصه، ما درباره ابزارهای مختلفی که می توانید برای استفاده از یک API RESTful استفاده کنید صحبت کرده ایم. ما برخی از کتابخانه های دات نت را ذکر کرده ایم که می توانند مانند HttpWebRequest، WebClient و HttpClient و همچنین برخی از ابزارهای شخص ثالث شگفت انگیز مانند RestSharp و ServiceStack انجام دهند. شما همچنین به این ابزارها معرفی بسیار کوتاهی کردید و نمونه هایی بسیار ساده ای را برای نشان دادن نحوه استفاده از آنها به شما نشان دادیم.