HATEOAS (hypermedia به عنوان موتور حالت برنامه) یک محدودیت مهم REST است. بدون آن، REST API را نمیتوان RESTful در نظر گرفت و بسیاری از مزایایی که ما با اجرای یک معماری REST بدست میآوریم در دسترس نیستند.
hypermedia به هر نوع محتوایی که شامل لینکهای رسانهای مانند اسناد، تصاویر و ویدیو باشد، اشاره میکند.
REST architecture به ما اجازه میدهد تا به صورت پویا لینکهای hypermedia را در پاسخهای خود ایجاد کنیم و در نتیجه باعث تسهیل در ناوبری آسانتر شود. برای بیان این موضوع، در مورد یک وب سایت فکر کنید که از هایپر لینکها برای کمک به شما در مسیر یابی به بخشهای مختلف آن استفاده میکند. شما میتوانید همان اثر را با HATEOAS در REST به دست آورید.
وب سایتی را تصور کنید که صفحه اصلی دارد و شما داخل صفحه اصلی هستید اما داخل صفحه اصلی هیچ لینکی به هیچ کجا وجود ندارد لذا شما برای پیدا کردن مسیر خود در وب سایت دچار مشکل میشوید البته که api مانند یک وب سایت نیست
توانایی کشف api برای خودتان میتواند بسیار مفید باشد.
اجازه دهید ببینیم این دقیقاً چگونه کار میکند.
اجازه دهید بگوییم که میخواهیم برخی مالکان از api را بدست آوریم.
اما چطور میتوانیم این کار را بکنیم ؟
ما حتی نمیدونیم چطور به مالکان برسیم ؟ خوب ، اول تنها چیزی که میدانیم این است که چگونه درخواست کنیم و این ریشه برنامه است :https://localhost:50001/api
نقطه پایانی ریشه باید بیشتر در مورد API و یا ترجیحاً جایی که شروع به کاوش آن میکند، به ما بگوید:
[ { "href": "http://localhost:5001/api", "rel": "self", "method": "GET" }, { "href": "http://localhost:5001/api/owner", "rel": "owner", "method": "GET" }, { "href": "http://localhost:5000/api/owner", "rel": "create_owner", "method": "POST" } ]
بسیار خوب, حالا میدانیم چه چیزی برای ما در دسترس است و میتوانیم به دنبال مالکان فعلی باشیم:http://localhost:5001/api/owner
و در واقع مالکان:
[ { "Id": "24fd81f8-d58a-4bcc-9f35-dc6cd5641906", "Name": "John Keen", "DateOfBirth": "1980-12-05T00:00:00", "Address": "61 Wellfield Road", "Links": [ { "href": "https://localhost:5001/api/owner/24fd81f8-d58a-4bcc-9f35-dc6cd5641906", "rel": "self", "method": "GET" }, { "href": "https://localhost:5001/api/owner/24fd81f8-d58a-4bcc-9f35-dc6cd5641906", "rel": "delete_owner", "method": "DELETE" }, { "href": "https://localhost:5001/api/owner/24fd81f8-d58a-4bcc-9f35-dc6cd5641906", "rel": "update_owner", "method": "PUT" } ] }, { "Id": "261e1685-cf26-494c-b17c-3546e65f5620", "Name": "Anna Bosh", "DateOfBirth": "1974-11-14T00:00:00", "Address": "27 Colored Row", "Links": [ { "href": "https://localhost:5001/api/owner/261e1685-cf26-494c-b17c-3546e65f5620", "rel": "self", "method": "GET" }, { "href": "https://localhost:5001/api/owner/261e1685-cf26-494c-b17c-3546e65f5620", "rel": "delete_owner", "method": "DELETE" }, { "href": "https://localhost:5001/api/owner/261e1685-cf26-494c-b17c-3546e65f5620", "rel": "update_owner", "method": "PUT" } ] }, "..." ]
همانطور که میبینید, ما لیستی از مالکان و تمام کارهایی که میتوانیم روی آنها انجام بدهیم را داریم. و …
بنابراین ، این یک روش خوب برای ساختن یک API قابل کشف و تکامل است.
با توجه به تعریف RFC5988 لینک "یک اتصال تایپ شده بین دو منبع که توسط شناسه منابع بین المللی (IRIs) شناسایی می شوند" هستش.به بیان ساده ما از پیوندهایی برای پیمایش اینترنت یا بهتر بگوییم منابع موجود در اینترنت استفاده می کنیم.
پاسخ های ما شامل آرایه ای از پیوندها است که براساس چند پراپرتی مطابق RFC تشکیل شده است:
پس تمامی مزیت هایی که میتوانیم در هنگام اجرای HATEOAS انتظار داشته باشیم چیست ؟
HATEOAS برای پیاده سازی به هیچ عنوان ساده نیست اما مزیت هایی که دارد به دشواری آن می ارزد . برخی از این موارد عبارتند از :
ما می توانیم کارهای زیادی با HATEOAS انجام دهیم. اما از آنجا که پیاده سازی همه این ویژگی ها آسان نیست ، باید دامنه API خود را بخاطر بسپاریم و اگر واقعاً به همه این موارد احتیاج داریم. تفاوت زیادی بین یک API عمومی با حجم زیاد و برخی از API های داخلی وجود دارد که برای برقراری ارتباط بین قسمت های همان سیستم مورد نیاز است.
مانند هر چیز دیگری ، زمینه همه چیز است. ساده باش
در حال حاضر این تئوری بیش از حد کافی است. بیایید در قسمت بعد شروع به کار کنیم و ببینیم که اجرای دقیق HATEOAS چگونه است.
منبع : https://code-maze.com/hateoas-aspnet-core-web-api/#preparation