REST đã được nhiều lập trình viên sử dụng để gửi dữ liệu qua HTTP, trong khi GraphQL thường được biết đến như một công nghệ thay thế của API REST. Trong bài viết này, tôi sẽ giải thích những điểm lợi cũng như hạn chế và sự khác biệt giữa REST và GraphQL. Điều này sẽ giúp bạn quyết định nên chọn gì cho dự án tiếp theo của mình.
REST là gì?
REST (Representational state transfer) là một phương thức tạo API được sử dụng để triển khai các dịch vụ web bằng cách sử dụng một tập hợp các hoạt động không trạng thái được xác định trước (bao gồm GET
, POST
, PUT
, và DELETE
).
Ý tưởng cốt lõi của REST là bạn sẽ truy xuất tài nguyên bằng cách đưa qua một yêu cầu tới URL của tài nguyên và nhận được phản hồi (thường là JSON, nhưng nó phụ thuộc vào API).
Lợi thế của REST
- REST có khả năng mở rộng, vì nó tách biệt máy khách và máy chủ để bạn có thể mở rộng ứng dụng của mình một cách dễ dàng.
- Tính linh hoạt là một lợi thế khác của việc sử dụng REST, vì nó có thể được thiết kế để xử lý các loại cuộc gọi khác nhau và trả về các định dạng dữ liệu khác nhau.
Hạn chế của REST
- Over-fetching — Đây là khi endpoint API cung cấp nhiều thông tin hơn so với yêu cầu của khách hàng.
- Under-fetching — Đây là khi endpoint API không cung cấp tất cả thông tin bắt buộc. Vì vậy, khách hàng phải thực hiện nhiều yêu cầu để có được mọi thứ mà ứng dụng cần.
GraphQL là gì?
GraphQL là một ngôn ngữ truy vấn dành cho API được tạo ra với mục đích nhắm tới những kiểu dữ liệu phức tạp, đa lớp với nhiều thành phần. GraphQL từ khi xuất hiện đã gần như thay thế hoàn toàn REST bởi tính hiệu quả, mạnh mẽ và linh hoạt hơn nhiều.
Lợi thế của GraphQL
- Truy xuất dữ liệu chính xác và chỉ vậy thôi. Trong GraphQL, bạn sẽ nhận được những gì bạn request, đây là một điểm cộng quá tuyệt vời.
- Chỉ cần thay đổi phía Client. Thông thường, khi có các thay đổi về yêu cầu dữ liệu, bạn chỉ cần sửa đổi truy vấn và không cần thay đổi nhiều. Cả client và server đều có thể làm việc độc lập, miễn là cả hai đều biết cấu trúc của dữ liệu.
Hạn chế của GraphQL
- Có thể hơi phức tạp đối với các ứng dụng đơn giản, để thiết lập các loại truy vấn, v.v., vì nó có thể được thực hiện dễ dàng hơn bằng REST.
- Nó sử dụng một endpoint duy nhất thay vì tuân theo HTTP lưu vào cache. Lưu vào cache ở mức độ mạng rất quan trọng vì nó có thể làm giảm lượng lưu lượng truy cập vào máy chủ.
Ví dụ đơn giản để so sánh cả hai
Giả sử chúng ta cần phải hiển thị danh sách bài đăng của tác giả và những người theo dõi họ. Trong trường hợp này, chúng ta phải hiển thị tác giả của bài đăng, bài đăng cũng như những người đang theo dõi người dùng đó.
Nếu sử dụng REST, chúng ta sẽ cần ít nhất 2 hoặc 3 request, như thế này:
/user/<id>
để có được thông tin chi tiết về người dùng (tác giả) có thể là tên./user/<id>/posts
để lấy danh sách các bài được đăng bởi người dùng đó./user/<id>/followers
để lấy danh sách người đang theo dõi người dùng.
Nhưng trong tất cả những trường hợp này, chúng ta đang over-fetching dữ liệu. Ví dụ, trong request đầu tiên, chúng ta chỉ cần lấy tên, nhưng cái ta nhận được là tất cả các chi tiết về người dùng khi sử dụng cách này.
Và đây là lúc GraphQL cho thấy sức mạnh của nó. Chúng ta cần chỉ định truy vấn và nhận được đầu ra mong muốn. Chúng ta sẽ sử dụng một truy vấn như sau:
query { User(id: '123') { name posts { title } followers { name } } }
Với truy vấn như này, ta sẽ nhận được JSON response với các thuộc tính sau. Gọn gàng và đơn giản, đúng không anh em
GraphQL và REST
Tóm lại, đây là một vài điểm khác biệt nổi bật:
1.Data fetching
REST gây ra over-fetching hoặc under-fetching, trong khi đây không phải là vấn đề của GraphQL. Trong GraphQL, những điều gì bạn yêu cầu thì bạn nhận được đúng những điều đó.
2. Định nghĩa đối tượng (JSON response)
Với REST, bạn xác định đối tượng trong Backend. Còn với GraphQL, bạn xác định đối tượng trên Frontend.
3. Bộ nhớ đệm tự động
REST tự động lưu vào cache trong khi GraphQL không có hệ thống lưu cache tự động, nhưng có thể khắc phục bằng việc sử dụng các ứng dụng phía client như Apollo Client, Relay, v.v. sẽ mang lại khả năng lưu vào cache.
4. Xử lý lỗi
Xử lý lỗi trong REST đơn giản hơn nhiều so với GraphQL. Tuy nhiên, khi GraphQL sử dụng cùng các ứng dụng phía client như Apollo Client, Relay, … sẽ rất dễ dàng xử lý lỗi.
Kết bài
GraphQL chắc chắn có nhiều lợi thế hơn REST, nhưng nó không phải lúc nào cũng là cách tốt nhất. Như tôi đã nói trước đó, sự lựa chọn phụ thuộc vào ứng dụng của bạn, cho dù chọn REST hay GraphQL.
Tôi hy vọng bài này có thể giúp bạn đưa ra quyết định trong các dự án tương lai. Nếu bạn muốn chia sẻ kinh nghiệm của mình về GraphQL hoặc REST, hãy để chúng trong phần bình luận. Cảm ơn các bạn đã đọc!