طراحی تعاملی REST APIs با پروتکل HTTP
وب سرویسها وب سرورهای هدفمندی هستند که نیازهای یک سایت یا هر برنامه دیگری را پشتیبانی میکنند. برنامه های مشتری از رابطهای برنامه نویسی کاربردی (API) برای ارتباط با سرویسهای وب استفاده مینمایند. به طور کلی، یک API مجموعهای از دادهها و عملکردها را برای تسهیل تعامل بین برنامههای رایانهای و اجازه تبادل اطلاعات به آنها را در معرض نمایش میگذارد. همانطور که در تصویر زیر نشان داده شده است، یک Web API چهره یک سرویس وب است که مستقیماً به درخواستهای مشتری گوش داده و به آنها پاسخ میدهد.
سبک معماری REST معمولاً برای طراحی API برای خدمات وب مدرن اعمال میشود. یک Web API مطابق با سبک معماری REST یک API REST است.
داشتن یک REST API یک وب سرویس را "RESTful" میکند. REST API از مجموعه ای از منابع به هم پیوسته تشکیل شده است. این مجموعه از منابع به عنوان مدل منبع REST API شناخته می شود. API های REST با طراحی خوب می توانند توسعه دهندگان مشتری را برای استفاده از خدمات وب جذب کنند. در بازار آزاد امروزی که سرویسهای وب رقیب برای جلب توجه رقابت میکنند، طراحی REST API از نظر زیباییشناختی یک ویژگی ضروری است.
برای بسیاری از ما، طراحی REST API گاهی اوقات بیشتر شبیه یک هنر است تا علم. برخی از بهترین روشها برای طراحی REST API به طور ضمنی در استاندارد HTTP وجود دارد، در حالی که سایر رویکردهای شبه استاندارد در چند سال گذشته ظهور کردهاند. با این حال، امروز، ما باید همچنان به دنبال پاسخ برای تعدادی از سوالات، مانند زیر ادامه دهیم:
چه زمانی باید بخش های مسیر URI با اسامی جمع نامگذاری شوند؟
کدام متد درخواست باید برای به روز رسانی وضعیت منبع استفاده شود؟
چگونه عملیات غیر CRUD را به URI های خود نگاشت کنم؟
کد وضعیت پاسخ HTTP مناسب برای یک سناریو چیست؟
چگونه می توانم نسخه های نمایش وضعیت یک منبع را مدیریت کنم؟
چگونه باید یک هایپرلینک را در JSON ساختار دهم؟
طراحی تعاملی با HTTP
HTTP/1.1
APIهای REST همه جنبههای پروتکل انتقال ابرمتن، نسخه 1.1* (HTTP/1.1) از جمله متدهای درخواست، کدهای پاسخ و سرصفحههای پیام را در بر میگیرند.
متدهای درخواست
کلاینت ها متد تعامل مورد نظر را در قسمت Request-Line یک پیام درخواست HTTP مشخص می کنند. RFC 2616 دستور Request-Line را مطابق شکل زیر تعریف می کند:
Request-Line=Method SP Request-URI SP HTTP-Version CRLF
هر متد HTTP دارای معنایی خاص و کاملاً تعریف شده در چارچوب مدل منبع REST API است. هدف GET بازیابی نمایشی از وضعیت یک منبع است. HEAD برای بازیابی ابرداده های مرتبط با وضعیت منبع استفاده می شود. PUT باید برای افزودن یک منبع جدید به یک فروشگاه یا به روز رسانی یک منبع استفاده شود. DELETE یک منبع را از والد آن حذف می کند. POST باید برای ایجاد یک منبع جدید در یک مجموعه و اجرای کنترلرها استفاده شود.
قانون: GET و POST نباید برای تونل کردن متدهای درخواست دیگر استفاده شوند
تونل سازی به هرگونه سوء استفاده از HTTP اشاره دارد که هدف یک پیام را پنهان یا نادرست نشان دهد و شفافیت پروتکل را تضعیف کند. یک REST API نباید طراحی خود را با استفاده نادرست از متدهای درخواست HTTP در تلاش برای سازگاری با مشتریان با واژگان محدود HTTP به خطر بیاندازد. همیشه از متدهای HTTP همانطور که در قوانین این بخش مشخص شده است به درستی استفاده کنید.
قانون: برای بازیابی نمایشی از یک منبع باید از GET استفاده شود
یک سرویس گیرنده REST API از متد GET در یک پیام درخواست برای بازیابی وضعیت یک منبع، به شکلی نمایشی استفاده می کند. پیام درخواست GET مشتری ممکن است حاوی سرصفحه باشد اما فاقد بدنه باشد.
معماری وب به شدت بر ماهیت متد GET متکی است. مشتریان روی اینکه بتوانند درخواست های GET را بدون ایجاد عوارض جانبی تکرار کنند، حساب می کنند. کش ها به توانایی ارائه نمایش های کش شده بدون تماس با سرور مبدا بستگی دارند.
در مثال زیر، میتوانیم ببینیم که چگونه یک توسعهدهنده مشتری ممکن است از curl از یک پوسته فرمان برای دریافت نمایشی از وضعیت فعلی یک منبع "سلام" استفاده کند:
$ curl -v http://api.example.restapi.org/greeting
> GET /greeting HTTP/1.1
> User-Agent: curl/7.20.1
> Host: api.example.restapi.org
> Accept: */*
< HTTP/1.1 200 OK
< Date: Sat, 20 Aug 2011 16:02:40 GMT
< Server: Apache
< Expires: Sat, 20 Aug 2011 16:03:40 GMT
< Cache-Control: max-age=60, must-revalidate
< ETag: text/html:hello world
< Content-Length: 130
< Last-Modified: Sat, 20 Aug 2011 16:02:17 GMT
< Vary: Accept-Encoding
< Content-Type: text/html
Greeting
Hello World!