Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
GraphQL được nhiều người nhắc đến như người kế nhiệm REST, nhưng thực tế hai kiểu API này giải quyết bài toán hơi khác nhau. Chọn cái nào phụ thuộc vào ứng dụng khách của bạn cần gì, và đội ngũ của bạn đã quen gì.
Với REST, mỗi tài nguyên có một địa chỉ, server quyết định hình dạng dữ liệu trả về. Để hiển thị trang hồ sơ có thông tin người dùng, bài viết gần đây và số người theo dõi, ứng dụng có thể phải gọi ba endpoint:
GET /users/12GET /users/12/posts?limit=5GET /users/12/followers/countHai vấn đề quen thuộc có thể xuất hiện: over-fetching (nhận về nhiều trường hơn cần) và under-fetching (phải gọi nhiều lần mới đủ dữ liệu).
GraphQL có thường chỉ một endpoint. Client gửi truy vấn mô tả chính xác các trường nó muốn và nhận về đúng như vậy:
query { user(id: 12) { name avatarUrl posts(limit: 5) { title createdAt } followersCount }}Một request, đủ dữ liệu, không thừa. Server định nghĩa một schema có kiểu rõ ràng, và đây cũng là tài liệu sống của API:
type User { id: ID! name: String! posts(limit: Int = 10): [Post!]! followersCount: Int!}type Query { user(id: ID!): User}Thay đổi dữ liệu dùng mutation, còn nhận cập nhật theo thời gian thực dùng subscription.
REST rất phù hợp với API công khai đơn giản, thao tác CRUD, dịch vụ giữa các hệ thống (server-to-server), tải tệp và những nơi cần cache HTTP mạnh. Nó dễ hiểu, công cụ phong phú, hầu như lập trình viên nào cũng biết. Một API REST được thiết kế tốt thường là đủ cho đa số dự án.
| Tiêu chí | REST | GraphQL |
|---|---|---|
| Số endpoint | Nhiều | Thường một |
| Hình dạng dữ liệu | Server quyết định | Client quyết định |
| Cache | Cache HTTP dễ | Cần giải pháp riêng |
| Đường cong học | Thấp | Cao hơn |
| Tài liệu | OpenAPI | Schema tự mô tả |
Không ít hệ thống giữ REST cho các tác vụ đơn giản và tích hợp bên ngoài, đồng thời thêm một lớp GraphQL phía trước cho ứng dụng giao diện phức tạp. Lớp này có thể đóng vai trò cổng gom dữ liệu từ nhiều dịch vụ phía sau. Hãy bắt đầu từ vấn đề thật mà bạn đang gặp thay vì chạy theo xu hướng.
Nếu quyết định dùng GraphQL, hãy lên kế hoạch cho các vấn đề vận hành ngay từ đầu. Thứ nhất, đặt giới hạn: độ sâu truy vấn tối đa, số phần tử tối đa mỗi danh sách, thời gian thực thi tối đa. Thứ hai, tắt hoặc hạn chế tính năng introspection ở môi trường production nếu API không công khai. Thứ ba, ghi log theo tên thao tác (operation name) thay vì chỉ thấy một đường dẫn duy nhất, để biết truy vấn nào đang chậm. Cuối cùng, đầu tư vào công cụ sinh kiểu dữ liệu cho client từ schema, vì lợi ích lớn nhất của GraphQL là hợp đồng kiểu chặt chẽ giữa hai phía.
Nếu ứng dụng nhỏ và bạn chưa gặp vấn đề over-fetching, hãy cứ dùng REST. Khi nhiều client có nhu cầu đa dạng và giao diện phức tạp, hãy thử GraphQL ở một phần nhỏ trước. Quyết định tốt đến từ việc hiểu rõ đánh đổi, không phải từ việc chọn thứ nghe hiện đại hơn.
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