Get in touch
or send us a question?
CONTACT

Thiết kế API RESTful đúng chuẩn – Clean, dễ mở rộng và dễ maintain

API là “bộ mặt” của hệ thống back-end.
Một API thiết kế kém có thể khiến:

  • Front-end khó tích hợp

  • Bug phát sinh liên tục

  • Version sau phá vỡ version cũ

Trong bài viết này, chúng ta sẽ đi qua các nguyên tắc quan trọng để thiết kế API RESTful đúng chuẩn, áp dụng được ngay cho các dự án thực tế.


1. RESTful là gì (hiểu đúng, tránh nhầm)

REST (Representational State Transfer) không phải là framework, mà là tập hợp các nguyên tắc thiết kế API.

Một API RESTful tốt:

  • Xoay quanh resource (tài nguyên)

  • Sử dụng HTTP method đúng nghĩa

  • Stateless (server không lưu state của client)

  • Dễ đọc, dễ đoán, dễ mở rộng


2. Thiết kế URL theo resource, không theo action

❌ Sai (theo action)

POST /createUser
POST /updateUser
GET /getUserById

✅ Đúng (theo resource)

POST /users
GET /users/{id}
PUT /users/{id}
DELETE /users/{id}

👉 HTTP Method đã nói lên hành động, URL chỉ nên mô tả resource.


3. Sử dụng HTTP Method đúng cách

Method Ý nghĩa Ví dụ
GET Lấy dữ liệu GET /users
POST Tạo mới POST /users
PUT Cập nhật toàn bộ PUT /users/1
PATCH Cập nhật một phần PATCH /users/1
DELETE Xóa DELETE /users/1

⚠️ Không dùng GET để thay đổi dữ liệu (tránh bug cache, bảo mật).


4. HTTP Status Code – đừng trả 200 cho mọi thứ

Status code giúp client hiểu chuyện gì đang xảy ra mà không cần đọc body.

Các status nên dùng thường xuyên:

Code Khi nào dùng
200 OK Request thành công
201 Created Tạo resource thành công
204 No Content Thành công nhưng không trả data
400 Bad Request Dữ liệu client gửi sai
401 Unauthorized Chưa đăng nhập
403 Forbidden Không có quyền
404 Not Found Không tìm thấy resource
422 Unprocessable Entity Validate lỗi
500 Internal Server Error Lỗi server

👉 Ví dụ tạo user:

HTTP/1.1 201 Created

5. Chuẩn hóa response format

❌ Response lộn xộn

{
"ok": true,
"msg": "success",
"data_user": {...}
}

✅ Response rõ ràng, nhất quán

{
"data": {
"id": 1,
"name": "John"
},
"meta": {
"request_id": "abc123"
}
}

Với lỗi validate:

{
"error": {
"code": "VALIDATION_ERROR",
"message": "Email is invalid",
"fields": {
"email": "Invalid format"
}
}
}

6. Versioning API – bắt buộc cho hệ thống lâu dài

Cách phổ biến nhất:

/api/v1/users
/api/v2/users

Vì sao cần version?

  • Tránh phá client cũ

  • Dễ refactor, nâng cấp API

  • Cho phép migrate dần

👉 Không bao giờ sửa breaking change trên version cũ.


7. Pagination, filter, sort – đừng trả hết dữ liệu

❌ Sai

GET /users

(trả về 100.000 records)

✅ Đúng

GET /users?page=1&limit=20&sort=-created_at&status=active

Response:

{
"data": [...],
"meta": {
"page": 1,
"limit": 20,
"total": 534
}
}

8. Authentication & Authorization trong API

Auth phổ biến:

  • JWT (stateless, phổ biến)

  • OAuth2 (khi tích hợp bên thứ ba)

  • Session-based (app truyền thống)

Best practice:

  • Token gửi qua header:

Authorization: Bearer <token>
  • Không gửi token qua query string

  • Tách rõ:

    • 401: chưa đăng nhập

    • 403: không có quyền


9. Idempotency – chi tiết nhỏ nhưng rất quan trọng

Một request idempotent có thể gọi nhiều lần mà kết quả không đổi.

Ví dụ:

  • PUT /users/1 → idempotent

  • POST /orders → không idempotent

👉 Với thanh toán:

  • Dùng Idempotency-Key để tránh tạo đơn hàng trùng khi retry.


10. Những sai lầm phổ biến của back-end dev

❌ Trả status 200 cho mọi lỗi
❌ URL chứa động từ (/create, /update)
❌ Không version API
❌ Response không nhất quán
❌ Không giới hạn pagination
❌ Log thiếu context khi API lỗi


Kết luận

Một API RESTful tốt sẽ:

  • Dễ đọc – dễ đoán – dễ mở rộng

  • Giảm bug giữa front-end & back-end

  • Tiết kiệm rất nhiều thời gian bảo trì về sau

“API design không chỉ là code chạy được, mà là contract giữa các team.”

Nếu bạn đầu tư thiết kế API ngay từ đầu, hệ thống của bạn sẽ scale mượt hơn rất nhiều khi lớn lên.