GraphQL và REST khác nhau ở điểm nào?
GraphQL và REST là hai cách tiếp cận khác nhau trong việc thiết kế API để trao đổi dữ liệu qua Internet. REST cho phép các ứng dụng máy khách trao đổi dữ liệu với một máy chủ bằng cách sử dụng các động từ HTTP, vốn là giao thức giao tiếp chuẩn của Internet. Mặt khác, GraphQL là một ngôn ngữ truy vấn API xác định các thông số kỹ thuật về cách thức ứng dụng khách yêu cầu dữ liệu từ máy chủ từ xa phải như thế nào. Bạn có thể sử dụng GraphQL trong lệnh gọi API của mình mà không cần dựa vào ứng dụng phía máy chủ để xác định yêu cầu. Cả GraphQL và REST đều là những công nghệ mạnh mẽ đứng sau hầu hết các ứng dụng hiện đại.
Những điểm tương đồng giữa GraphQL và REST là gì?
Cả GraphQL và REST đều là các kiểu kiến trúc API phổ biến cho phép trao đổi dữ liệu giữa các dịch vụ hoặc ứng dụng khác nhau trong một mô hình máy khách – máy chủ.
API tạo điều kiện cho việc truy cập dữ liệu và các thao tác dữ liệu như:
- Một máy khách gửi yêu cầu API đến một điểm cuối hoặc nhiều điểm cuối trên một máy chủ
- Máy chủ cung cấp phản hồi có chứa dữ liệu, trạng thái dữ liệu hoặc mã lỗi
REST và GraphQL cho phép bạn tạo, sửa đổi, cập nhật và xóa dữ liệu trên một ứng dụng, dịch vụ hoặc mô-đun riêng biệt thông qua API. API được phát triển với REST được gọi là API RESTful hoặc API REST. API được phát triển với GraphQL chỉ đơn giản là API GraphQL.
Đội ngũ frontend và backend sử dụng các kiến trúc API này để tạo ra các ứng dụng dạng mô-đun và có thể truy cập. Sử dụng kiến trúc API giúp hệ thống được bảo mật, ở dạng mô-đun và có quy mô linh hoạt. Kiến trúc API cũng làm cho hệ thống đạt hiệu năng cao hơn và dễ dàng tích hợp với các hệ thống khác.
Tiếp theo, chúng ta sẽ thảo luận về một số điểm tương đồng khác giữa GraphQL và REST.
Kiến trúc
Cả REST và GraphQL đều thực hiện một số nguyên tắc kiến trúc API phổ biến. Ví dụ: cả hai đều có chung các nguyên tắc sau:
- Cả hai đều không có trạng thái, vì vậy máy chủ không lưu lịch sử phản hồi giữa các yêu cầu
- Cả hai đều sử dụng mô hình máy khách – máy chủ, vì vậy các yêu cầu từ một máy khách duy nhất sẽ nhận được các phản hồi từ một máy chủ duy nhất
- Cả hai đều dựa trên HTTP, vì HTTP là giao thức giao tiếp cơ bản
Thiết kế dựa trên tài nguyên
REST và GraphQL đều thiết kế việc trao đổi dữ liệu của mình xung quanh tài nguyên. Tài nguyên được hiểu là bất kỳ dữ liệu hoặc đối tượng nào mà máy khách có thể truy cập và thao tác thông qua API. Mỗi tài nguyên có mã định danh duy nhất riêng (URI) và một tập hợp các thao tác (phương thức HTTP) mà máy khách có thể thực hiện trên đó.
Ví dụ: hãy xem xét một API mạng xã hội nơi người dùng tạo và quản lý bài đăng. Trong API dựa trên tài nguyên, bài đăng sẽ là một tài nguyên. Nó có mã định danh duy nhất riêng, ví dụ: /posts/1234. Đồng thời, nó có một tập hợp các thao tác, như GET để truy xuất bài đăng trong REST hoặc query (truy vấn) để truy xuất bài đăng trong GraphQL.
Trao đổi dữ liệu
Cả REST và GraphQL đều hỗ trợ các định dạng dữ liệu giống nhau.
JSON là định dạng trao đổi dữ liệu phổ biến nhất mà tất cả các ngôn ngữ, nền tảng và hệ thống đều hiểu được. Máy chủ trả về dữ liệu JSON cho máy khách. Các định dạng dữ liệu khác có được hỗ trợ nhưng ít được sử dụng hơn, bao gồm XML và HTML.
Tương tự, REST và GraphQL đều hỗ trợ khả năng ghi vào bộ nhớ đệm. Vì vậy, máy khách và máy chủ có thể lưu dữ liệu thường xuyên được truy cập vào bộ nhớ đệm để tăng tốc độ giao tiếp.
Tính trung lập về ngôn ngữ và cơ sở dữ liệu
Cả API GraphQL và REST đều hoạt động với bất kỳ cấu trúc cơ sở dữ liệu và ngôn ngữ lập trình nào, cả phía máy khách và phía máy chủ. Do vậy, các API này có khả năng tương tác cao với mọi ứng dụng.
GraphQL cố gắng khắc phục những hạn chế nào của REST?
GraphQL xuất hiện vào năm 2012 để đáp ứng nhu cầu về tốc độ trong các nền tảng mạng xã hội mới nổi. Các nhà phát triển nhận thấy rằng các kiến trúc API hiện có, như REST, có cấu trúc và quá dài để tạo ra nguồn cấp tin tức một cách hiệu quả.
Tiếp theo, chúng ta sẽ thảo luận về một số thách thức mà các API này phải đối mặt.
Trao đổi dữ liệu có cấu trúc cố định
API REST đòi hỏi các yêu cầu máy khách phải tuân theo một cấu trúc cố định để nhận tài nguyên. Cấu trúc cứng nhắc này rất dễ sử dụng, nhưng không phải lúc nào cũng là phương tiện hiệu quả nhất để trao đổi chính xác dữ liệu cần.
Lấy thừa dữ liệu và lấy thiếu dữ liệu
API REST luôn trả về một tập dữ liệu toàn bộ. Ví dụ: từ một đối tượng person (người) trong API REST, bạn sẽ nhận được tên, ngày sinh, địa chỉ và số điện thoại của người đó. Bạn sẽ nhận được tất cả dữ liệu này ngay cả khi bạn chỉ cần lấy số điện thoại.
Tương tự, nếu bạn muốn biết số điện thoại của một người và lần mua gần đây nhất, bạn sẽ cần nhiều yêu cầu API REST. URL /person sẽ trả về số điện thoại và URL /purchase sẽ trả về lịch sử mua hàng.
Các nhà phát triển mạng xã hội đã phải viết rất nhiều mã chỉ để xử lý các yêu cầu API, điều này ảnh hưởng đến hiệu năng và trải nghiệm người dùng.
GraphQL xuất hiện như một giải pháp dựa trên truy vấn. Truy vấn có thể trả về dữ liệu chính xác chỉ trong một trao đổi yêu cầu và phản hồi API.
Điểm khác biệt chính giữa GraphQL và REST
API REST là một khái niệm kiến trúc cho giao tiếp ứng dụng. Trong khi đó, GraphQL là một thông số kỹ thuật, một ngôn ngữ truy vấn API và một bộ công cụ. GraphQL hoạt động trên một điểm cuối duy nhất bằng HTTP.
Ngoài ra, quá trình phát triển REST tập trung nhiều hơn vào việc tạo ra các API mới. Trong khi đó, GraphQL tập trung vào hiệu năng và tính linh hoạt của API.
Tiếp theo, chúng tôi sẽ chỉ ra thêm một số điểm khác biệt nữa.
Yêu cầu phía máy khách
Dưới đây là những thứ mà một yêu cầu REST sử dụng để hoạt động:
- Các động từ HTTP xác định hành động
- Một URL xác định tài nguyên sẽ được thực hiện hành động theo động từ HTTP
- Các thông số và giá trị để phân tích cú pháp, nếu bạn muốn tạo hoặc sửa đổi một đối tượng trong một nguồn lực phía máy chủ hiện có
Ví dụ: bạn sử dụng GET để có được dữ liệu chỉ đọc từ một tài nguyên, POST để thêm một mục tài nguyên mới, hoặc PUT để cập nhật một tài nguyên.
Ngược lại, đây là những thứ mà các yêu cầu GraphQL sử dụng:
- Truy vấn để nhận dữ liệu chỉ đọc
- Biến đổi để sửa đổi dữ liệu
- Đăng ký để nhận các bản cập nhật dữ liệu dựa trên sự kiện hoặc truyền phát
Định dạng dữ liệu mô tả cách bạn muốn máy chủ trả về dữ liệu, bao gồm các đối tượng và trường phù hợp với lược đồ phía máy chủ. Bạn cũng có thể nhập dữ liệu mới. Trong nội bộ, GraphQL gửi mọi yêu cầu máy khách dưới dạng một yêu cầu HTTP POST.
Dữ liệu trả về cho máy khách
Theo kiến trúc REST, dữ liệu được trả về cho máy khách từ máy chủ trong cấu trúc “toàn bộ tài nguyên” do máy chủ chỉ định. Các ví dụ sau đây thể hiện dữ liệu trả về trong REST và GraphQL.
Ví dụ về dữ liệu trả về trong REST
Trong REST, GET /posts trả về như sau:
[
{
"id": 1,
"title": "Bài đăng đầu tiên",
"content": "Đây là nội dung của bài đăng đầu tiên."
},
{
"id": 2,
"title": "Bài đăng thứ hai",
"content": "Đây là nội dung của bài đăng thứ hai."
},
{
"id": 3,
"title": "Bài đăng thứ ba",
"content": "Đây là nội dung của bài đăng thứ ba."
}
]
Ví dụ về dữ liệu trả về trong GraphQL
Khi bạn sử dụng GraphQL, chỉ có dữ liệu được chỉ định trong cấu trúc do máy khách đưa ra mới được trả về.
GET /graphql?query{post(id: 1) {id title content}} chỉ trả về bài đăng đầu tiên:
{
"data": {
"posts": [
{
"id": "1",
"title": "Bài đăng đầu tiên",
"content": "Đây là nội dung của bài đăng đầu tiên."
},
]}}
Lược đồ phía máy chủ
GraphQL sử dụng lược đồ phía máy chủ để xác định dữ liệu và dịch vụ dữ liệu, khác với API REST.
Lược đồ được viết bằng ngôn ngữ định nghĩa lược đồ GraphQL, bao gồm các chi tiết như sau:
- Các loại và trường đối tượng thuộc về mỗi đối tượng
- Hàm bộ phân giải phía máy chủ xác định một thao tác cho từng trường
Lược đồ xác định rõ ràng loại để mô tả tất cả dữ liệu có sẵn trên hệ thống và cách máy khách có thể truy cập hoặc sửa đổi dữ liệu đó.
Trong khi đó, API REST không yêu cầu lược đồ phía máy chủ. Nhưng bạn có thể chọn xác định lược đồ để thiết kế API, tài liệu và phát triển máy khách hiệu quả.
Versioning
Khi API phát triển, các cấu trúc và thao tác dữ liệu của chúng có thể thay đổi. Đối với các máy khách không có kiến thức về những thay đổi này, việc thay đổi có thể phá vỡ hệ thống của máy khách hoặc gây ra các lỗi không xác định.
API REST thường bao gồm lập phiên bản trong URL để giải quyết vấn đề này, như https://example.com/api/v1/person/12341. Tuy nhiên, lập phiên bản là không bắt buộc và có thể gây ra lỗi.
GraphQL yêu cầu khả năng tương thích ngược API. Vì vậy, các trường bị xóa trả về một thông báo lỗi, hoặc những trường có thẻ deprecated (không còn được đề xuất sử dụng) trả về một cảnh báo.
Xử lý lỗi
GraphQL là một kiến trúc API được định kiểu mạnh, nghĩa là GraphQL yêu cầu mô tả chi tiết về dữ liệu, cấu trúc dữ liệu và các thao tác dữ liệu trong lược đồ. Do mức độ chi tiết trong lược đồ, hệ thống có thể tự động xác định lỗi yêu cầu và đưa ra các thông báo lỗi hữu ích.
API REST được định kiểu yếu và bạn phải xây dựng quy trình xử lý lỗi vào mã xung quanh. Ví dụ: nếu một yêu cầu PUT phân tích cú pháp một giá trị số dưới dạng văn bản thay vì dạng số nguyên, hệ thống sẽ không tự động xác định lỗi.
So sánh về thời điểm nên sử dụng GraphQL hay REST
Bạn có thể sử dụng các API GraphQL và REST thay thế cho nhau. Tuy nhiên, trong một số trường hợp sẽ có một API phù hợp hơn API kia.
Ví dụ: GraphQL có thể là lựa chọn tốt hơn nếu bạn có những cân nhắc sau:
- Bạn có băng thông giới hạn và bạn muốn giảm thiểu số lượng yêu cầu và phản hồi
- Bạn có nhiều nguồn dữ liệu và bạn muốn kết hợp chúng tại một điểm cuối
- Bạn có các yêu cầu máy khách có sự khác biệt đáng kể và bạn muốn có các phản hồi rất khác nhau
Trong khi đó, REST có thể là lựa chọn tốt hơn nếu bạn có những cân nhắc sau:
- Bạn có các ứng dụng nhỏ hơn với dữ liệu ít phức tạp hơn
- Bạn có dữ liệu và các thao tác mà tất cả máy khách đều sử dụng giống nhau
- Bạn không có yêu cầu đối với truy vấn dữ liệu phức tạp
Cũng có thể xây dựng một ứng dụng duy nhất có cả API GraphQL và API REST cho các lĩnh vực chức năng khác nhau.
Cách sử dụng cả GraphQL và REST trên cùng một API
Có thể nâng cấp một API RESTful lên một API GraphQL mà không cần thực hiện viết lại hoàn toàn.
Dưới đây là phác thảo quá trình:
- Hiểu mô hình dữ liệu của API RESTful. Để thực hiện điều này, hãy kiểm tra hình dạng của dữ liệu trong từng tài nguyên URL.
- Viết lược đồ GraphQL từ mô hình dữ liệu.
- Xác định xem máy khách thực hiện thao tác nào trên dữ liệu và thêm các thao tác đó vào lược đồ.
- Xây dựng chức năng bộ phân giải trong mã phía máy chủ cho từng trường trong lược đồ.
- Tạo một máy chủ GraphQL có các bộ phân giải và lược đồ.
Sau đó, máy khách có thể giao tiếp với API của bạn bằng GraphQL hoặc REST.
Tóm tắt các điểm khác biệt giữa REST và GraphQL
REST |
GraphQL |
|
Đó là gì? |
REST là một tập hợp các quy tắc định hình quá trình trao đổi dữ liệu có cấu trúc giữa một máy khách và một máy chủ. |
GraphQL là một ngôn ngữ truy vấn, kiểu kiến trúc và tập hợp các công cụ để tạo và thao tác với các API. |
Trường hợp sử dụng phù hợp nhất |
REST phù hợp với các nguồn dữ liệu đơn giản trong đó tài nguyên được xác định rõ ràng. |
GraphQL phù hợp với các nguồn dữ liệu lớn, phức tạp và liên quan đến nhau. |
Truy cập dữ liệu |
REST có nhiều điểm cuối dưới dạng URL để xác định tài nguyên. |
GraphQL có một điểm cuối URL duy nhất. |
Dữ liệu trả về |
REST trả về dữ liệu theo một cấu trúc cố định do máy chủ xác định. |
GraphQL trả về dữ liệu theo một cấu trúc linh hoạt do máy khách xác định. |
Cách dữ liệu được cấu trúc và xác định |
Dữ liệu REST định kiểu yếu. Vì vậy, máy khách phải quyết định cách diễn giải dữ liệu đã định dạng khi dữ liệu được trả về. |
Dữ liệu GraphQL định kiểu mạnh. Vì vậy, máy khách nhận dữ liệu theo định dạng đã xác định trước và cả hai bên cùng hiểu. |
Kiểm tra lỗi |
Với REST, khách hàng phải kiểm tra xem dữ liệu trả về có hợp lệ hay không. |
Với GraphQL, các yêu cầu không hợp lệ thường bị cấu trúc lược đồ từ chối. Điều này làm xuất hiện một thông báo lỗi được tự động tạo. |
AWS có thể hỗ trợ các yêu cầu của bạn về GraphQL và REST như thế nào?
Amazon Web Services (AWS) giúp bạn xây dựng và cung cấp các API được quản lý tốt hơn.
AWS AppSync tạo ra các API GraphQL phi máy chủ và API gửi – đăng ký nhận (pub/sub). Chúng đơn giản hóa quá trình phát triển ứng dụng thông qua một điểm cuối duy nhất để truy vấn, cập nhật hoặc phát hành dữ liệu một cách an toàn.
Với AWS AppSync, bạn tạo ra các API để cho phép khách hàng thực hiện các thao tác sau:
- Tương tác với nhiều nguồn dữ liệu như SQL, NoSQL, dữ liệu tìm kiếm, điểm cuối REST và các vi dịch vụ với chỉ một lệnh gọi mạng
- Tự động đồng bộ dữ liệu giữa các ứng dụng di động và web và đám mây
- Truyền phát dữ liệu từ backend đến và giữa các máy khách được kết nối
- Truy cập dữ liệu Internet vạn vật (IoT) để xây dựng bảng điều khiển thời gian thực trong ứng dụng di động hoặc web
Tương tự như vậy, Cổng API Amazon là dịch vụ được quản lý toàn phần giúp bạn dễ dàng tạo, phát hành, duy trì, giám sát và bảo vệ API ở mọi quy mô.
Dưới đây là những cách bạn có thể được lợi bằng cách sử dụng Cổng API:
- Mang đến cho người dùng hiệu suất tốc độ cao cho cả phản hồi và yêu cầu API
- Cấp quyền truy cập vào API của bạn
- Chạy đồng thời nhiều phiên bản của cùng một API để lặp lại, kiểm tra và phát hành các phiên bản mới một cách nhanh chóng
- Theo dõi các chỉ số hiệu năng và thông tin về lệnh gọi API, độ trễ dữ liệu và tỷ lệ lỗi
Bắt đầu sử dụng GraphQL và REST trên AWS bằng cách tạo tài khoản ngay hôm nay.