REST vs GraphQL: Khác nhau thế nào và nên dùng cái nào?
REST và GraphQL là hai cách thiết kế API — cách thống nhất để các màn hình trong ứng dụng của bạn (hoặc các chương trình khác) yêu cầu dữ liệu từ backend. Với REST, mỗi loại đối tượng có một URL riêng, như /customers hoặc /orders, và mỗi URL trả về một cấu trúc dữ liệu cố định. Với GraphQL, thường chỉ có một URL, và bên gọi gửi một truy vấn liệt kê chính xác các trường muốn nhận lại. Với hầu hết ứng dụng xây bằng AI, REST là lựa chọn mặc định đơn giản và tốt hơn.
Vì sao điều này quan trọng khi bạn xây dựng bằng AI
Khi bạn yêu cầu một công cụ xây dựng AI tạo "một ứng dụng có backend", nó phải chọn cách frontend và backend giao tiếp với nhau. Bạn không cần quyết định điều này mỗi lần — nhưng bạn sẽ gặp các thuật ngữ này trong code, trong tài liệu và khi kết nối với các dịch vụ bên ngoài. Một số dịch vụ chỉ cung cấp một kiểu: nhiều dịch vụ cung cấp API REST, trong khi những dịch vụ khác — ví dụ Shopify và GitHub — cũng cung cấp hoặc ưu tiên GraphQL. Hiểu được sự khác biệt giúp bạn hiểu mình đang nhìn vào cái gì và tránh thêm độ phức tạp không cần thiết. Nếu "API" còn mới với bạn, hãy bắt đầu với API là gì.
Một ví dụ đời thường
REST giống như thực đơn set tại nhà hàng. Mỗi món (endpoint) được đưa ra đúng như bếp đã thiết kế. Bạn gọi món "khách hàng" và nhận được cả đĩa — tên, email, địa chỉ, ngày đăng ký — dù bạn chỉ muốn tên. Muốn có thêm các đơn hàng gần đây của khách? Đó là một món thứ hai.
GraphQL giống như gọi món theo kiểu à la carte với một người phục vụ. Bạn ghi lại chính xác những gì bạn muốn: "tên khách hàng, cùng ngày và tổng tiền của ba đơn hàng gần nhất." Một đơn, một đĩa, chỉ những thứ bạn yêu cầu. Nhưng bếp phải được thiết lập để xử lý bất kỳ tổ hợp nào khách có thể ghi ra.
Cùng một yêu cầu, theo hai cách
Giả sử một trang khách hàng cần tên của khách và ba đơn hàng gần nhất.
Với REST, thường là hai yêu cầu:
GET /api/customers/42
GET /api/customers/42/orders?limit=3
Phản hồi đầu tiên có thể bao gồm nhiều thông tin hơn mức trang cần:
{ "id": 42, "name": "Lena Park", "email": "lena@example.com", "address": "…", "createdAt": "…" }
Với GraphQL, chỉ có một yêu cầu, thường là một POST tới một endpoint duy nhất như /graphql, mang theo một truy vấn:
query {
customer(id: 42) {
name
orders(last: 3) {
date
total
}
}
}
Và phản hồi phản chiếu chính xác truy vấn:
{
"data": {
"customer": {
"name": "Lena Park",
"orders": [
{ "date": "2026-09-20", "total": 48.0 },
{ "date": "2026-09-02", "total": 19.5 },
{ "date": "2026-08-15", "total": 72.25 }
]
}
}
}
Cả hai đều trả về JSON. Khác biệt nằm ở việc ai quyết định cấu trúc: với REST, máy chủ quyết định; với GraphQL, bên gọi quyết định, trong phạm vi schema của máy chủ cho phép.
So sánh song song
| REST | GraphQL | |
|---|---|---|
| URL | Nhiều — mỗi tài nguyên một URL | Thường là một (/graphql) |
| Ai định hình phản hồi | Máy chủ | Client, thông qua truy vấn |
| Đọc và ghi | Các phương thức HTTP: GET, POST, PATCH, DELETE | Truy vấn (đọc) và mutation (ghi) |
| Lấy dữ liệu liên quan | Thường cần nhiều yêu cầu | Thường chỉ cần một yêu cầu |
| Lấy thừa dữ liệu (nhận các trường không cần) | Phổ biến | Được tránh ngay trong thiết kế |
| Schema / kiểu dữ liệu | Tùy chọn (ví dụ mô tả OpenAPI) | Bắt buộc — schema có kiểu được tích hợp sẵn |
| Lưu đệm HTTP (trình duyệt, CDN) | Đơn giản với yêu cầu GET | Khó hơn; thường do thư viện client xử lý |
| Lỗi | Mã trạng thái HTTP (404, 401, 500) | Thường là danh sách errors trong nội dung phản hồi, thường đi kèm trạng thái 200 |
| Bảo mật và kiểm soát chi phí | Quy tắc cho từng endpoint | Cũng cần giới hạn độ sâu và kích thước truy vấn |
| Độ khó học và công cụ | Thấp; hoạt động với mọi công cụ HTTP | Cao hơn; cần máy chủ GraphQL và thường cần thư viện client |
Mỗi loại phù hợp với đâu
Chọn REST khi:
- Bạn đang xây dựng một ứng dụng điển hình: hệ thống đặt chỗ, CRM, bảng điều khiển, cửa hàng.
- Một frontend giao tiếp với một backend, và bạn kiểm soát cả hai.
- Bạn muốn thứ đơn giản nhất để gỡ lỗi, lưu đệm và bảo mật.
- Các dịch vụ khác sẽ gọi ứng dụng của bạn (webhook và hầu hết tích hợp đều mong đợi endpoint kiểu REST).
Cân nhắc GraphQL khi:
- Nhiều client khác nhau — một website, một ứng dụng di động, các tích hợp đối tác — cần những phần dữ liệu rất khác nhau từ cùng một tập dữ liệu.
- Dữ liệu của bạn liên kết sâu (sản phẩm, biến thể, đánh giá, người bán, tồn kho) và các màn hình cần kết hợp chúng theo nhiều cách.
- Bạn đang sử dụng một dịch vụ mà API chính của họ là GraphQL.
Một quy tắc hữu ích: nếu bạn không chắc mình cần GraphQL, thì có lẽ bạn chưa cần. Thêm vào sau thì dễ hơn là gỡ bỏ.
Thuật ngữ chính
| Thuật ngữ | Ý nghĩa |
|---|---|
| Endpoint | Một URL cụ thể mà API phản hồi. |
| Tài nguyên (Resource) | Một loại đối tượng mà API quản lý — đặt chỗ, khách hàng. |
| Schema | Mô tả đầy đủ, có kiểu về những gì một API GraphQL có thể trả về. |
| Query / mutation | Trong GraphQL: yêu cầu đọc dữ liệu / yêu cầu thay đổi dữ liệu. |
| Resolver | Đoạn code phía máy chủ lấy dữ liệu cho một trường GraphQL. |
| Over-fetching / under-fetching | Lấy nhiều dữ liệu hơn mức cần / cần thêm yêu cầu để lấy đủ dữ liệu. |
| Vấn đề N+1 | Khi lấy một danh sách cộng với chi tiết của từng mục sẽ kích hoạt một truy vấn cơ sở dữ liệu cho mỗi mục — một bẫy hiệu năng kinh điển của GraphQL (và cả REST). |
| OpenAPI | Cách tiêu chuẩn để mô tả endpoint và dữ liệu của API REST. |
Những hiểu lầm thường gặp
- "GraphQL mới hơn, nên nó tốt hơn." Nó giải quyết những vấn đề cụ thể. Với một ứng dụng đơn lẻ có một frontend, nó thường thêm việc mà không mang lại nhiều lợi ích.
- "GraphQL là một cơ sở dữ liệu." Không phải. Nó là một lớp API; phía sau nó, máy chủ vẫn đọc từ cơ sở dữ liệu của bạn.
- "GraphQL luôn nhanh hơn." Ít yêu cầu hơn có thể giúp ích trên mạng di động chậm, nhưng một truy vấn không giới hạn có thể tải một lượng dữ liệu khổng lồ. Hiệu năng phụ thuộc vào backend.
- "REST có nghĩa là một tiêu chuẩn nghiêm ngặt." Trong thực tế, "REST API" thường được hiểu lỏng lẻo là các URL tài nguyên cùng với phương thức HTTP và JSON. Rất nhiều API tốt cũng linh hoạt với các quy tắc chính thức.
- "Trạng thái 200 nghĩa là đã thành công." Với GraphQL, hãy kiểm tra trường
errors— một yêu cầu có thể thất bại một phần và vẫn trả về 200.
Nên hỏi công cụ xây dựng AI của bạn điều gì
- "Dùng một API REST đơn giản với JSON trừ khi có lý do rõ ràng để không làm vậy — hãy giải thích nếu bạn cho rằng cần GraphQL."
- "Liệt kê mọi endpoint, nó trả về gì và ai được phép gọi."
- "Với trang khách hàng, chỉ trả về các trường mà trang đó sử dụng."
- "Thêm phân trang cho các endpoint danh sách để chúng không bao giờ trả về hàng nghìn dòng cùng lúc."
- "Dịch vụ này chỉ có API GraphQL — gọi nó từ máy chủ, giữ khóa trong một secret, và chỉ yêu cầu các trường chúng ta cần."
- "Trả về mã trạng thái HTTP đúng và thông báo lỗi dạng JSON."
REST và GraphQL trong Mythex
Tài liệu của Mythex có một công thức về xây dựng backend REST API kèm câu lệnh khởi đầu, và một backend có thể chạy trên Node, Python (FastAPI), C# hoặc Java cùng với ứng dụng web của bạn. Tài liệu không mô tả mẫu GraphQL, vì vậy nếu bạn muốn có một mẫu, hãy yêu cầu rõ ràng và nêu lý do. Gọi một API GraphQL của bên thứ ba hoạt động như bất kỳ dịch vụ bên ngoài nào khác — xem tích hợp bất kỳ API nào. Đọc thêm: frontend vs backend và cách xây dựng REST API.
Câu hỏi thường gặp
Khác biệt chính giữa REST và GraphQL là gì?
Một API REST có nhiều URL, mỗi URL cho một loại tài nguyên, và mỗi URL trả về một cấu trúc dữ liệu cố định. Một API GraphQL thường chỉ có một URL, và client gửi một truy vấn mô tả chính xác các trường mà nó cần, nên một yêu cầu có thể lấy dữ liệu liên quan theo đúng cấu trúc mà màn hình cần.
GraphQL có tốt hơn REST không?
Nói chung, không cái nào tốt hơn cái nào. GraphQL hữu ích khi nhiều màn hình hoặc ứng dụng khác nhau cần các phần dữ liệu khác nhau từ một tập dữ liệu phức tạp, có liên kết. REST đơn giản hơn để xây dựng, lưu đệm và bảo mật, và là lựa chọn mặc định tốt hơn cho hầu hết các ứng dụng nhỏ và vừa.
GraphQL có nhanh hơn REST không?
Không tự động. GraphQL có thể giảm số lượng yêu cầu mà một màn hình gửi đi, nhưng một truy vấn phức tạp đơn lẻ có thể chậm và tốn tài nguyên trên máy chủ. Tốc độ phụ thuộc nhiều hơn vào cách xây dựng backend và cơ sở dữ liệu so với kiểu API.
Một ứng dụng có thể dùng cả REST và GraphQL không?
Có. Nhiều ứng dụng cung cấp API GraphQL cho frontend của chính mình trong khi dùng REST cho webhook và các tích hợp bên thứ ba, hoặc gọi API GraphQL của các công ty khác từ một backend REST.