Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Hai lập trình viên cùng làm API có thể tạo ra hai kiểu hoàn toàn khác nhau: một bên gọn gàng dễ đoán, một bên đủ thứ /getUser, /doDelete. Thiết kế REST giúp API nhất quán để người dùng nó đoán trước được hành vi. Dưới đây là những nguyên tắc thực dụng nhất.
Trong REST, URL đại diện cho tài nguyên (danh từ), còn hành động được thể hiện bằng phương thức HTTP. So sánh:
POST /createUser, GET /getAllOrders, POST /deleteOrder?id=5POST /users, GET /orders, DELETE /orders/5Dùng danh từ số nhiều, chữ thường, phân cách bằng dấu gạch ngang nếu nhiều từ (/order-items), và nhất quán trong toàn hệ thống.
| Phương thức | Ý nghĩa | Ví dụ |
|---|---|---|
| GET | Đọc dữ liệu, không thay đổi gì | GET /users/12 |
| POST | Tạo mới | POST /users |
| PUT | Thay thế toàn bộ tài nguyên | PUT /users/12 |
| PATCH | Cập nhật một phần | PATCH /users/12 |
| DELETE | Xóa | DELETE /users/12 |
Hai khái niệm đáng nhớ: an toàn (GET không được làm thay đổi dữ liệu) và idempotent (gọi nhiều lần cho cùng kết quả như gọi một lần; GET, PUT, DELETE là idempotent, còn POST thì không). Điều này quan trọng khi client thử lại do mạng chập chờn.
Dùng lồng nhau khi có quan hệ sở hữu rõ ràng, nhưng đừng lồng quá hai cấp:
GET /users/12/orders # đơn hàng của người dùng 12GET /orders/77 # truy cập trực tiếp một đơn hàngPOST /users/12/orders # tạo đơn hàng cho người dùng 12Với hành động không khớp CRUD, bạn có thể mô hình hóa thành tài nguyên con hoặc dùng động từ khi bất khả kháng, ví dụ POST /orders/77/cancel. Thực dụng quan trọng hơn thuần túy.
GET /products?category=books&min_price=50000&sort=-created_at&page=2&per_page=20Giữ đường dẫn cho định danh tài nguyên, còn các điều kiện tùy chọn đặt ở query string. Quy ước dấu trừ trước tên trường để sắp xếp giảm dần là phổ biến nhưng bạn có thể chọn khác, miễn là nhất quán và có tài liệu.
Hãy chọn một cấu trúc cho thành công và một cho lỗi, rồi dùng xuyên suốt:
// Thành công{ "data": { "id": 12, "name": "An" } }// Lỗi{ "error": { "code": "validation_failed", "message": "Email không hợp lệ", "fields": { "email": ["không đúng định dạng"] } } }Một mã lỗi dạng chuỗi ổn định (như validation_failed) giúp ứng dụng khách xử lý logic mà không phải đọc thông điệp văn bản, vốn có thể thay đổi hoặc dịch sang ngôn ngữ khác.
user_id, chỗ userId.Một API tốt đi kèm tài liệu đủ để người khác dùng mà không phải hỏi bạn. Mô tả từng endpoint, tham số, ví dụ yêu cầu và phản hồi, các mã lỗi có thể gặp. Dùng đặc tả OpenAPI để tài liệu có thể được sinh và kiểm thử tự động.
Hãy áp dụng ngay. Với một blog, các tài nguyên chính là bài viết, bình luận và người dùng. Danh sách endpoint hợp lý có thể là: GET /posts lấy danh sách, POST /posts tạo bài, GET /posts/{id} xem một bài, PATCH /posts/{id} sửa, DELETE /posts/{id} xóa, và GET /posts/{id}/comments cùng POST /posts/{id}/comments cho bình luận. Chỉ mười dòng như vậy đã mô tả gần như toàn bộ hệ thống, và bất kỳ ai nhìn vào cũng đoán được cách dùng mà không cần đọc tài liệu.
Khi nhóm đã đồng ý về danh sách này, việc triển khai ở bất kỳ ngôn ngữ nào cũng trở nên rõ ràng, và nhóm làm giao diện có thể bắt đầu song song với dữ liệu giả. Đó là lợi ích thực tế nhất của việc thiết kế API trước khi viết code.
REST không phải bộ luật cứng nhắc mà là tập quy ước giúp API dễ đoán. Hãy nhất quán, dùng đúng phương thức và mã trạng thái, thiết kế từ góc nhìn người dùng API. Trước khi viết code, thử phác thảo danh sách endpoint ra giấy; bạn sẽ phát hiện nhiều vấn đề thiết kế sớm.
Muốn học bài bản và có lộ trình rõ ràng? Bạn có thể xem các khóa học trên codebem.com.
Nguyễn Đình Cường
0 comment