ایپیآی (API)
[ منبع ]طراحی API#
- ما عمدتاً از طراحی مبتنی بر منابع (Resource-Oriented Design) پیروی میکنیم که شامل سه عنصر اصلی است:
- منابع (Resources):
- شامل دادههایی هستند که میتوانند بهصورت تو در تو (nested) سازماندهی شوند.
- برای هر منبع، متدهایی برای انجام عملیات مختلف تعریف میشود.
- مجموعهها (Collections):
- گروهی از منابع (Resources)، یک مجموعه (Collections) را تشکیل میدهند.
- آدرسهای اینترنتی (URLs):
- مکان آنلاین یک منبع (Resource) یا مجموعه (Collection) را مشخص میکنند.
- منابع (Resources):
-
در طراحی مسیرهای (URL) از kebab-case استفاده کنید.
-
برای پارامترهای موجود در Query String یا فیلدهای منبع، از camelCase استفاده کنید.
-
نام منابع در URL باید به صورت kebab-case و جمع (plural) باشد.
-
همیشه از اسامی جمع برای آدرس (URL)هایی که به یک مجموعه اشاره میکنند استفاده کنید:
/users
- در سورس کد، اسامی جمع را به متغیرها و پراپرتیهایی با پسوند «List» تبدیل کنید. (مانند
userList
به جایusers
)
- همیشه در طراحی URLها، ابتدا نام مجموعه (collection) را به صورت جمع ذکر کنید و سپس با استفاده از یک شناسه یکتا (identifier)، به یک منبع خاص در آن مجموعه اشاره کنید:
/students/245743
/airports/kjfk
plaintext- از URLهایی مانند این اجتناب کنید:
GET /blogs/:blogId/posts/:postId/summary
bash- افعال را از URLهای منابع خود حذف کنید.
- معمولاً از اسامی (nouns) در مسیرهای URL برای اشاره به منابع استفاده میشود. با این حال، در مواردی که نیاز به انجام عملیاتی دارید که به منبع خاصی مرتبط نیست (Non-resource) و در واقع یک عملکرد یا تابع را اجرا کرده و نتیجه را برمیگرداند، میتوانید از افعال (verbs) در مسیرهای URL استفاده کنید. این عملیاتها مربوط به CRUD (ایجاد، دریافت، بهروزرسانی، حذف) نیستند:
/translate?text=Hallo
bash- اگر درخواست (Request Body) یا پاسخ (Response) در قالب
JSON
است، ازcamelCase
برای نام پراپرتیهای JSON پیروی کنید تا یکپارچگی و انسجام حفظ شود.
- هرچند یک منبع (resource) مفهومی یکتا و مفرد است که مشابه با یک نمونه شیء یا رکورد در پایگاه داده میباشد، اما نباید از نام جدولهای پایگاه داده (
table_name
) برای نامگذاری منابع و از نام ستونها (column_name
) برای ویژگیهای منابع استفاده کنید.
- مجدداً تأکید میشود، در نامگذاری مسیر (URL) فقط از «اسم» استفاده کنید و از توضیح عملکرد آن بپرهیزید.
- عملیاتهای CRUD را با متدهای HTTP شرح دهید:
- برای منابع تو در تو (Nested Resources)، توصیه میشود رابطه بین آنها را از طریق شناسهها (
id
)، در ساختار URL منعکس کنید. بهعنوان مثال، با استفاده ازid
ارتباط یک کارمند با شرکت را نشان دهید.
- از یک عدد ترتیبی ساده با پیشوند
v
برای نسخهدهی استفاده کنید (مثال:v1
,v2
) و این نسخه را در ابتدای URL قرار دهید تا بیشترین دامنه تأثیرگذاری را داشته باشد:
http://api.domain.com/v1/schools/3/students
bash- پیامهای پاسخ (Response) باید بهخوبی توصیفکننده باشند، بهطوریکه گیرنده بتواند بهراحتی مفهوم آنها را درک کند. یک پیام خطای خوب میتواند به این شکل باشد:
{
"code": 1234,
"message": "Something bad happened",
"description": "More details"
}
jsonیا برای خطاهای اعتبارسنجی:
{
"code": 2314,
"message": "Validation Failed",
"errors": [
{
"code": 1233,
"field": "email",
"message": "Invalid email"
},
{
"code": 1234,
"field": "password",
"message": "No password provided"
}
]
}
json- از این کدهای وضعیت HTTP (Status Code) برای توصیف وضعیت پاسخها استفاده کنید تا نشان دهید آیا همه چیز درست انجام شده، خطایی از سمت کلاینت رخ داده، یا مشکلی در API وجود دارد:
-
در پاسخ (Response)، تعداد کل منابع را اعلام کنید.
-
پارامترهای
limit
وoffset
را برای کنترل اندازه پاسخ (Response) پشتیبانی کنید. -
توجه داشته باشید که ممکن است کاربر همیشه به نمایش کامل منبع نیاز نداشته باشد. برای محدود کردن فیلدهای موردنظر، از پارامتر
fields
استفاده کنید که مقادیر آن با کاما جدا میشوند:
GET /students?fields=id,name,age,class
bash- پیادهسازی قابلیت «صفحهبندی» (Pagination)، «فیلتر کردن» (Filtering) و «مرتبسازی» (Sorting) در ابتدای کار برای همه منابع ضروری نیست. اما منابعی که این قابلیتها را دارند باید مستند (از طریق Document) شوند.
امنیت ایپیآی (API security)#
اینها برخی از بهترین روشهای امنیتی پایه هستند:
- از احراز هویت پایه (Basic Authentication) تنها در ارتباطات امن (HTTPS) استفاده کنید. توکنهای احراز هویت (Authentication token) نباید در URL ارسال شوند:
GET /users/123?token=asdf....
bash- توکنها باید در هر درخواست، از طریق هدر Authorization ارسال شوند:
Authorization: Bearer xxxxxx, Extra yyyyy
bash-
مدت اعتبار کد احراز هویت (Authorization Code) باید کوتاه باشد.
-
هرگونه درخواست غیر ایمن (غیر TLS) را رد کرده و به آن پاسخ ندهید. به درخواستهای HTTP با کد
403 Forbidden
پاسخ دهید تا از هرگونه تبادل ناامن جلوگیری کنید. -
محدودیت نرخ درخواست (Rate Limiting) را اعمال کنید.
-
هدرهای HTTP را بهدرستی تنظیم کنید تا امنیت وباپلیکیشن شما افزایش یابد. (اطلاعات بیشتر… ↗)
-
دادههای دریافتشده را به فرم استاندارد تبدیل کنید یا در صورت خطا یا نامعتبر بودن، آن درخواست را با کد وضعیت
400 Bad Request
همراه با جزئیات خطا، رد کنید. -
تمام دادههایی که با REST API مبادله میشوند، باید توسط خود همان API اعتبارسنجی شوند.
-
دادههای JSON خود را سریالسازی (Serialize) کنید.
- نوع محتوا (Content-Type) را اعتبارسنجی کنید و عموماً از
application/*json
استفاده کنید.
- برای بررسی فهرست امنیتی APIها، به API Security Checklist ↗ مراجعه کنید.
مستندسازی ایپیآی (API documentation)#
-
بخش مرجع API را در قالب فایل README.md ↗ برای API تکمیل کنید
-
روشهای احراز هویت API را به همراه یک نمونه کد توضیح دهید.
-
ساختار URL (فقط مسیر بدون دامنه اصلی) را توضیح دهید و همچنین نوع درخواست (Method) را مشخص کنید.
برای هر Endpoint، موارد زیر را توضیح دهید:
- اگر پارامترهایی در URL وجود دارند، آنها را مطابق نام ذکرشده در بخش URL مشخص کنید:
موارد اجباری: id=[integer]
موارد اختیاری: photo_id=[alphanumeric]
plaintext-
در صورت استفاده از نوع درخواست
POST
، نمونههای عملی از درخواست را ارائه دهید. قوانین مربوط به پارامترهای URL برای این بخش نیز اعمال میشود. این قسمت باید به دو بخش اختیاری و ضروری تقسیم شود. -
وضعیت کد (Status Code) و اطلاعات بازگشتیِ پاسخ موفقیتآمیز (Success Response) را مشخص کنید. این اطلاعات زمانی مفید است که کاربران نیاز دارند بدانند که چه چیزی را از پاسخ دریافت خواهند کرد:
Code: 200
Content: { id : 12 }
bash- اغلب endpointها ممکن است به دلایل مختلفی دچار خطا شوند (مانند دسترسی غیرمجاز یا پارامترهای نادرست). همه این خطاها باید در این بخش (API documentation) ذکر شوند. ممکن است تکراری به نظر برسد، اما به جلوگیری از فرضیات نادرست کمک میکند. به عنوان مثال:
{
"code": 401,
"message": "Authentication failed",
"description": "Invalid username or password"
}
json- برای مستندسازی بهتر API، از ابزارهای متنباز متعددی که برای مستندسازی وجود دارند، استفاده کنید. ابزارهایی مانند API Blueprint ↗ و Swagger ↗ نمونههای خوبی هستند.