
GraphQL vs REST API: Lựa chọn cho dịch vụ web hiện đại?
Khi xây dựng dịch vụ web hiện đại, GraphQL vs REST API là câu hỏi hàng đầu mỗi khi kiến trúc sư phần mềm thiết kế lớp giao tiếp giữa client và server. Hai cách tiếp cận này đều là chuẩn mực ngành nhưng mang những triết niệm khác nhau. Bài viết phân tích điểm mạnh yếu, trường hợp dùng phù hợp, giúp bạn quyết định nhanh chóng.
REST API là gì?
REST (Representational State Transfer) dựa trên kiến trúc kín đáo URL và dùng HTTP method (GET, POST, PUT, DELETE) để thao tác tài nguyên qua endpoint. Mỗi endpoint đại diện một tài nguyên và trả về dữ liệu JSON. Thiết kế thuần REST đòi hỏi team phải suy nghĩ đúng quy ước truy cập, đặt tên endpoint nhất quán, và chuẩn hóa status code.

Một endpoint REST điển hình:
GET /api/books/1
Server trả về toàn bộ đối tượng book kể cả trường client không dùng — đây là overfetching. Nếu frontend cần dữ liệu tác giả lồng, nó phải gọi thêm GET /api/authors/1 — underfetching. Tình huống này khiến băng thông tăng, độ trễ tăng, và backend phải tạo endpoint mới cho mỗi màn hình.
GraphQL là gì?
GraphQL là ngôn ngữ truy vấn phía server (Facebook 2012, chuyển sang GraphQL Foundation 2018). Thay vì gọi nhiều endpoint, client gửi một query duy nhất mô tả chính xác trường cần lấy. Query có thể lồng sâu theo mối quan hệ schema định nghĩa. Server parse query, gọi resolver tương ứng, ghép kết quả khớp hình dạng query.
{ book(id: "1") { title author { firstName } } }
Server trả về chính xác dữ liệu client yêu cầu — tránh overfetching và underfetching. Client quyết định cấu trúc response, không phụ thuộc backend.
Schema mạnh mẽ định nghĩa kiểu dữ liệu, hỗ trợ introspection — client có thể tự khám phá API. Điều này giúp IDE, công cụ low-code hoạt động tốt. Nhiều framework hiện đại tích hợp schema tự động: Prisma sinh GraphQL từ model DB; Hasura tạo endpoint GraphQL từ schema database trong vài phút.
Schema mẫu:
type Book {
id: ID
title: String
published: Date
price: String
author: Author
}
type Author {
id: ID
firstName: String
lastName: String
books: [Book]
}
type Query {
book(id: ID!): Book
author(id: ID!): Author
}
So sánh trực tiếp
Bảng so sánh chi tiết GraphQL và REST theo từng tiêu chí quan trọng:
Kiến trúc dữ liệu
- REST: Danh sách endpoint tuyến tính
GET /books/:id,GET /authors/:id. Dữ liệu và cách truy cập gắn chặt vào URL. - GraphQL: Schema định nghĩa loại dữ liệu và mối quan hệ. Client quyết định cách truy cập và lấy trường nào.
Overfetching & Underfetching
REST thường gây overfetching — server trả dư dữ liệu. Hoặc underfetching — client phải gọi nhiều endpoint để lấy dữ liệu liên quan.
GraphQL khắc phục: client yêu cầu đúng trường, duy nhất một request để lấy nhiều nguồn dữ liệu lồng nhau. Đây là lợi thế lớn trên mobile nơi băng thông và pin quý hiếm.
Bản đồ resolver
REST dùng route handler:
app.get('/hello', (req, res) => res.send('Hello World!'))
GraphQL dùng resolver gắn trường:
const resolvers = { Query: { hello: () => 'Hello world!' } }
Cache
REST hượng lợi từ HTTP cache tiêu chuẩn (ETag, Cache-Control). GraphQL chưa tận dụng cache HTTP tự nhiên vì POST method. Cần giải pháp cache client như Apollo Client, urql, Relay.
Security & Rate limiting
REST dựa trên HTTP method và URL — dễ dàng cấu hình middleware bảo mật, rate limit ở phía load balancer. GraphQL dùng một endpoint chung (thường POST), cần parse query để đánh giá complexity. Các công cụ như Apollo Server hỗ trợ cost analysis và depth limiting để chống query đột ngột tốn tài nguyên.
Version API & Backward Compatibility
REST thường tạo bản độ /v1, /v2. GraphQL tránh version bằng schema evolve — client tự lấy trường cần thiết. Khi server thêm trường, client có thể dùng ngay; khi xóa trường, cần deprecation trước đó để tránh breaking change.
Type safety & Introspection
GraphQL schema cung cấp IDE tự động hoàn thiệp, type check thời gian biên dịch. REST cần Swagger/OpenAPI tự quản, đồng bộ thủ công khi endpoint thay đổi.
GraphQL vs REST: Khi nào dùng?

Chọn GraphQL khi
- Bản vẽ dữ liệu phức tạp, lồng nhau
- Client đa dạng (web, mobile) mỗi màn hình cần dữ liệu khác nhau
- Team frontend cần tự lấy dữ liệu, giảm phụ thuộc backend tạo endpoint mới
- Hệ sinh thái công cụ type-safe quan trọng (Prisma, Hasura, Apollo)
Chọn REST khi
- Dịch vụ đơn giản, vài resource rõ ràng
- Cần cache HTTP mạnh, CDN tối ưu
- Team chưa quen công nghệ GraphQL mới
- Bảo mật, rate limit dựa trên HTTP method/thanh phần tử nguyên
Công cụ hỗ trợ
- GraphQL toolchain: Apollo Server, Hasura, Yoga, Mercurius.
- ORM: Prisma tích hợp GraphQL directive, sinh schema từ model.
- Client: Apollo Client (cache, link), urql (nhẹ), Relay (hiệu năng cao).
- REST tooling: Swagger/OpenAPI, Postman, RESTDataSource.
Kết luận
GraphQL và REST không phải đối thủ hoàn toàn. Cả hai đều là cách gọi function qua mạng. GraphQL nổi bẹt ở truy vấn linh hoạt, giảm overfetching, hỗ trợ schema mạnh. REST vẫn vượt trội cache HTTP và độ phứu tạp thấp cho service đơn giản. Lờp pháp: GraphQL cho hệ thống phức tạp đa client; REST cho rapid prototype và dịch vụ nhỏ. Kết hợp cả hai — dùng Apollo Connectors để GraphQL gọi REST endpoint — cũng là kết quả thực tế tốt nhất.
Nguồn tham khảo:
