ADR-013 - Quy ước đặt tên endpoint, method và tham số cho API hệ thống dx-vas
📌 Bối cảnh¶
Trong hệ thống dx-vas, nhiều API được phát triển bởi các đội khác nhau. Một số inconsistency phổ biến đã xảy ra:
- Endpoint dạng /getAllStudents, /updateCourse, không tuân theo chuẩn REST
- Tham số có lúc là snake_case, lúc lại camelCase
- Đôi khi action được encode vào tên path thay vì dùng HTTP method đúng cách
Điều này gây khó khăn cho: - Người dùng API (frontend, mobile, service khác) - Việc sinh tài liệu tự động từ OpenAPI - Khả năng phân tích logs và theo dõi endpoint
🧠 Quyết định¶
Áp dụng chuẩn RESTful + đặt tên nhất quán cho path, method và tham số API toàn hệ thống, tuân theo quy ước cụ thể sau.
📏 Quy ước đặt tên path¶
✅ Tên tài nguyên dùng số nhiều, snake_case, tiếng Anh¶
- Ví dụ:
/students,/courses,/teachers - Nếu truy cập 1 phần tử:
/students/{student_id}
✅ Dùng tiền tố version: /api/v1/...¶
✅ Không encode hành động vào tên path¶
- ❌ Không dùng:
/createStudent,/getAllCourses,/deleteUser - ✅ Thay bằng:
POST /studentsGET /coursesDELETE /users/{id}
✅ Hành động đặc biệt dùng sub-path dạng động từ¶
POST /students/{id}/deactivatePOST /classes/{id}/assign- Luôn document rõ action này là “custom”
✅ Tham số path dùng snake_case¶
GET /students/{student_id}(notstudentIdorStudentId)
⚙️ Quy ước HTTP Method¶
| Method | Mục đích | Ví dụ |
|---|---|---|
GET |
Lấy dữ liệu | GET /students, GET /students/{id} |
POST |
Tạo mới | POST /students |
PUT |
Ghi đè toàn bộ | PUT /students/{id} |
PATCH |
Cập nhật một phần | PATCH /students/{id} |
DELETE |
Xoá | DELETE /students/{id} |
🔍 Quy ước tham số truy vấn (query param)¶
✅ Tên tham số snake_case, rõ nghĩa¶
?class_id=5A&page=2&limit=20
✅ Paging: sử dụng page, limit¶
page: số trang bắt đầu từ 1limit: số phần tử tối đa mỗi trang- Ví dụ:
?page=2&limit=10→ lấy phần tử thứ 11 đến 20
✅ Sắp xếp: dùng sort_by, order¶
sort_by: tên field để sắp xếp (ví dụ:created_at,score)order: hướng sắp xếp, nhận giá trịaschoặcdesc(mặc định làascnếu không có)- Quy ước áp dụng khi sắp xếp nhiều trường:
- Dùng tiền tố
-trước tên field để chỉdesc, không có tiền tố làasc - Ví dụ:
?sort_by=-created_at,name→ sắp xếpcreated_at DESC, name ASC
🧪 Kiểm tra tự động¶
- Tích hợp linter vào CI/CD để bắt endpoint sai định dạng
- Lint rule cho OpenAPI generator để enforce path/method/param đúng
✅ Lợi ích¶
- Giảm chi phí học API cho dev mới, client
- Tăng khả năng sinh docs, test, mock tự động
- Thống nhất khi log và monitor endpoint API
❌ Rủi ro & Giải pháp¶
| Rủi ro | Giải pháp |
|---|---|
| Các API legacy không theo chuẩn | Có layer chuyển đổi tạm (alias route), hoặc bổ sung docs cảnh báo |
| Một số action đặc biệt không thể biểu diễn bằng REST | Cho phép dùng /resource/{id}/action dạng POST, nhưng phải document rõ |
🔄 Các phương án đã loại bỏ¶
| Phương án | Lý do không chọn |
|---|---|
| Đặt tên tuỳ ý theo hành động (get, create...) | Vi phạm chuẩn REST, khó sinh tool/docs |
| Dùng camelCase trong path/params | Không thống nhất với phần còn lại (đa số codebase snake_case) |
📎 Tài liệu liên quan¶
"Một API tốt được nhận biết không chỉ qua dữ liệu nó trả – mà qua cách nó đặt tên."