Chắc hẳn khi làm việc với API, việc xây dựng tài liệu (documents) đặc tả API, chức năng, tham số, các respone là điều cần thiết. Nếu như bạn đang gặp khó khăn trong việc đặt tả này hay không muốn đặc tả trên các file định dạng excel
chưa theo chuẩn thì hãy xem xét sử dụng Swagger.
Swagger cho phép bạn đặc tả cấu trúc APIs của bạn để máy có thể đọc được. Khả năng mô tả API đến tận “root” là điều thật tuyệt vời mà Swagger mang lại.
Swagger không chỉ đặc tả cấu trúc APIs, nó còn làm được nhiều hơn thế với hệ sinh thái đa dạng như sinh tạo 1 stub server cho APIs, sinh thư viện clients với 40 ngôn ngữ hay việc có thể test API trên chính Swagger. Tuy nhiên trọng phạm vi bài viết, mình chỉ nói về cấu trúc file mà Swagger sử dụng để đặc tả API.
Demo:
1. Basic Structure
Swagger có thể được viết dưới dạng JSON
hoặc YAML
. Trong hướng dẫn này, chúng tôi chỉ sử dụng ví dụ dạng YAML
nhưng JSON
hoạt động tốt tương đương. Một Swagger với định dạng YAML
sẽ có dạng như sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token key atrule">swagger</span><span class="token punctuation">:</span> <span class="token string">"2.0"</span> <span class="token key atrule">info</span><span class="token punctuation">:</span> <span class="token key atrule">title</span><span class="token punctuation">:</span> Sample API <span class="token key atrule">description</span><span class="token punctuation">:</span> API description in Markdown. <span class="token key atrule">version</span><span class="token punctuation">:</span> 1.0.0 <span class="token key atrule">host</span><span class="token punctuation">:</span> api.example.com <span class="token key atrule">basePath</span><span class="token punctuation">:</span> /v1 <span class="token key atrule">schemes</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> https <span class="token key atrule">paths</span><span class="token punctuation">:</span> <span class="token key atrule">/users</span><span class="token punctuation">:</span> <span class="token key atrule">get</span><span class="token punctuation">:</span> <span class="token key atrule">summary</span><span class="token punctuation">:</span> Returns a list of users. <span class="token key atrule">description</span><span class="token punctuation">:</span> Optional extended description in Markdown. <span class="token key atrule">produces</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> application/json <span class="token key atrule">responses</span><span class="token punctuation">:</span> <span class="token key atrule">200</span><span class="token punctuation">:</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> OK |
Nào, chúng ta cùng điểm qua các thành phần của nó là cái gì nhé
2. Metadata
Khởi đầu cho mỗi Swagger bắt đầu với version
, 2.0 đang là phiên bản cuối cùng của nó. Phiên bản giúp các trình dịch hiểu được cấu trúc tổng thể của phần nội dung tiếp theo.
1 2 | <span class="token key atrule">swagger</span><span class="token punctuation">:</span> <span class="token string">"2.0"</span> |
Tiếp theo, bạn cần định nghĩa các thông tin về API trong trường info
với các trường title
, description
(tùy chọn), version
(API version, không phải version của file hay Swagger)
1 2 3 4 5 | <span class="token key atrule">info</span><span class="token punctuation">:</span> <span class="token key atrule">title</span><span class="token punctuation">:</span> Sample API <span class="token key atrule">description</span><span class="token punctuation">:</span> API description in Markdown. <span class="token key atrule">version</span><span class="token punctuation">:</span> 1.0.0 |
3. Base URL
Base URL là phần dùng cho tất cả các API định nghĩa bao gồm: schemes
, host
, basePath
:
1 2 3 4 5 | <span class="token key atrule">host</span><span class="token punctuation">:</span> api.example.com <span class="token key atrule">basePath</span><span class="token punctuation">:</span> /v1 <span class="token key atrule">schemes</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> https |
Tất cả các đường link API đều quan hệ với base URL này. Ví dụ /users
thực tế có nghĩa là https://api.example.com/v1/users.
4. Consumes, Produces
Phần Consumes
và produces
định nghĩa loại MIME được hỗ trợ bởi API. “Root-level” định nghĩa có thể được ghi đè bởi các toán tử riêng biệt (các API cụ thể có thể định nghĩa lại phần này).
1 2 3 4 5 6 7 | <span class="token key atrule">consumes</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> application/json <span class="token punctuation">-</span> application/xml <span class="token key atrule">produces</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> application/json <span class="token punctuation">-</span> application/xml |
5. Path
Phần này chính là phần quan trọng, định nghĩa từng API cụ thể và phương thức HTTP được hỗ trợ trong các API này. GET
/users
được mô tả như sau:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token key atrule">paths</span><span class="token punctuation">:</span> <span class="token key atrule">/users</span><span class="token punctuation">:</span> <span class="token key atrule">get</span><span class="token punctuation">:</span> <span class="token key atrule">summary</span><span class="token punctuation">:</span> Returns a list of users. <span class="token key atrule">description</span><span class="token punctuation">:</span> Optional extended description in Markdown. <span class="token key atrule">produces</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> application/json <span class="token key atrule">responses</span><span class="token punctuation">:</span> <span class="token key atrule">200</span><span class="token punctuation">:</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> OK |
6. Parameters
Các toán tử có thể cần các tham số dựa trên URL path (/users/{userId
}), query string (/users?role=admin
), headers (X-CustomHeader: Value)
và trong request body. Bạn có thể định nghĩa các loại tham số, cấu trúc, mô tả chi tiết, yêu cầu hay tùy chọn hoặc các thông tin khác trong swagger như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token key atrule">paths</span><span class="token punctuation">:</span> /users/<span class="token punctuation">{</span>userId<span class="token punctuation">}</span><span class="token punctuation">:</span> <span class="token key atrule">get</span><span class="token punctuation">:</span> <span class="token key atrule">summary</span><span class="token punctuation">:</span> Returns a user by ID. <span class="token key atrule">parameters</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">in</span><span class="token punctuation">:</span> path <span class="token key atrule">name</span><span class="token punctuation">:</span> userId <span class="token key atrule">required</span><span class="token punctuation">:</span> <span class="token boolean important">true</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> integer <span class="token key atrule">minimum</span><span class="token punctuation">:</span> <span class="token number">1</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> Parameter description in Markdown. <span class="token key atrule">responses</span><span class="token punctuation">:</span> <span class="token key atrule">200</span><span class="token punctuation">:</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> OK |
7. Responses
Mỗi API tất nhiên đều response về một trạng thái (status codes) như 200 OK
hoặc 404 Not Found
và schema
(cấu trúc) của response body. Schemas này thì có thể được định nghĩa trực tiếp trong respone hoặc có thể tách ra định nghĩa ngoài vùng dựa bào $ref
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <span class="token key atrule">paths</span><span class="token punctuation">:</span> /users/<span class="token punctuation">{</span>userId<span class="token punctuation">}</span><span class="token punctuation">:</span> <span class="token key atrule">get</span><span class="token punctuation">:</span> <span class="token key atrule">summary</span><span class="token punctuation">:</span> Returns a user by ID. <span class="token key atrule">parameters</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">in</span><span class="token punctuation">:</span> path <span class="token key atrule">name</span><span class="token punctuation">:</span> userId <span class="token key atrule">required</span><span class="token punctuation">:</span> <span class="token boolean important">true</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> integer <span class="token key atrule">minimum</span><span class="token punctuation">:</span> <span class="token number">1</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> The ID of the user to return. <span class="token key atrule">responses</span><span class="token punctuation">:</span> <span class="token key atrule">200</span><span class="token punctuation">:</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> A User object. <span class="token key atrule">schema</span><span class="token punctuation">:</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> object <span class="token key atrule">properties</span><span class="token punctuation">:</span> <span class="token key atrule">id</span><span class="token punctuation">:</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> integer <span class="token key atrule">example</span><span class="token punctuation">:</span> <span class="token number">4</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> string <span class="token key atrule">example</span><span class="token punctuation">:</span> Arthur Dent <span class="token key atrule">400</span><span class="token punctuation">:</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> The specified user ID is invalid (e.g. not a number). <span class="token key atrule">404</span><span class="token punctuation">:</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> A user with the specified ID was not found. <span class="token key atrule">default</span><span class="token punctuation">:</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> Unexpected error |
8. Input and Output Models
Phần definitions
sẽ định nghĩa các cấu trúc dữ liệu chung để sử dụng trong API của bạn. Phần này có thể được tham chiếu qua $ref
bất cứ một shema nào – ở cả request body và response body. Ví dụ đây là JSON object:
1 2 3 4 5 | <span class="token punctuation">{</span> <span class="token property">"id"</span><span class="token operator">:</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Minh NV"</span> <span class="token punctuation">}</span> |
Có thể được mô tả bởi
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token key atrule">definitions</span><span class="token punctuation">:</span> <span class="token key atrule">User</span><span class="token punctuation">:</span> <span class="token key atrule">properties</span><span class="token punctuation">:</span> <span class="token key atrule">id</span><span class="token punctuation">:</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> integer <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> string <span class="token comment"># Both properties are required</span> <span class="token key atrule">required</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> id <span class="token punctuation">-</span> name |
Và được tham chiếu trong request body schema và response body schema như sau thông qua $ref
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token key atrule">paths</span><span class="token punctuation">:</span> /users/<span class="token punctuation">{</span>userId<span class="token punctuation">}</span><span class="token punctuation">:</span> <span class="token key atrule">get</span><span class="token punctuation">:</span> <span class="token key atrule">summary</span><span class="token punctuation">:</span> Returns a user by ID. <span class="token key atrule">parameters</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">in</span><span class="token punctuation">:</span> path <span class="token key atrule">name</span><span class="token punctuation">:</span> userId <span class="token key atrule">required</span><span class="token punctuation">:</span> <span class="token boolean important">true</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> integer <span class="token key atrule">responses</span><span class="token punctuation">:</span> <span class="token key atrule">200</span><span class="token punctuation">:</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> OK <span class="token key atrule">schema</span><span class="token punctuation">:</span> <span class="token key atrule">$ref</span><span class="token punctuation">:</span> <span class="token string">'#/definitions/User'</span> <span class="token key atrule">/users</span><span class="token punctuation">:</span> <span class="token key atrule">post</span><span class="token punctuation">:</span> <span class="token key atrule">summary</span><span class="token punctuation">:</span> Creates a new user. <span class="token key atrule">parameters</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">in</span><span class="token punctuation">:</span> body <span class="token key atrule">name</span><span class="token punctuation">:</span> user <span class="token key atrule">schema</span><span class="token punctuation">:</span> <span class="token key atrule">$ref</span><span class="token punctuation">:</span> <span class="token string">'#/definitions/User'</span> <span class="token key atrule">responses</span><span class="token punctuation">:</span> <span class="token key atrule">200</span><span class="token punctuation">:</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> OK |
9. Authentication
Từ khóa securityDefinitions
và security
được sử dụng để mô tả các phương thức yêu cầu xác thực.
1 2 3 4 5 6 | <span class="token key atrule">securityDefinitions</span><span class="token punctuation">:</span> <span class="token key atrule">BasicAuth</span><span class="token punctuation">:</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> basic <span class="token key atrule">security</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">BasicAuth</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> |
Phương thức xác thức được hỗ trợ bao gồm:
- Basic authentication
- API key (as a header or query parameter)
- OAuth 2 common flows (implicit, password, application and access code)