Facebook đã tạo ra GraphQL vào năm 2012 nhằm giải quyết các thách thức mà họ gặp phải khi phát triển ứng dụng với các hệ thống API truyền thống như REST. Khi các ứng dụng của Facebook trở nên phức tạp và cần xử lý lượng lớn dữ liệu, họ nhận thấy rằng việc sử dụng REST API không còn hiệu quả.
REST API thường yêu cầu client gửi nhiều yêu cầu để lấy đủ dữ liệu cần thiết, dẫn đến tình trạng over-fetching (lấy quá nhiều dữ liệu không cần thiết) hoặc under-fetching (lấy không đủ dữ liệu, buộc phải gửi thêm yêu cầu).
Hiện tại, GraphQL được quản lý bởi GraphQL Foundation, một tổ chức do các công ty công nghệ lớn lập ra. Tổ chức này giúp đỡ tài chính cho các dự án liên quan đến GraphQL, quản lý tên thương hiệu, cung cấp hỗ trợ pháp lý và duy trì các hoạt động của cộng đồng sử dụng GraphQL.
1. GraphQL là gì?
1.1 Định nghĩa GraphQL
GraphQL là một ngôn ngữ truy vấn và thao tác dữ liệu (data manipulation language) dành cho API, nó cho phép API consumer yêu cầu chính xác dữ liệu họ cần từ server mà không phải nhận thêm bất kỳ dữ liệu thừa nào, khác với các kiến trúc API truyền thống như REST.
Giả sử bạn muốn truy xuất thông tin người dùng X từ máy chủ. Với REST API, bạn sẽ nhận lại một Object chứa toàn bộ thông tin như tên, địa chỉ, số điện thoại, và email của người dùng mặc dù bạn chỉ cần tên và email. Với GraphQL, bạn có thể tạo một truy vấn chỉ yêu cầu tên và email, và máy chủ sẽ chỉ trả về đúng hai thông tin đó, giúp giảm băng thông và tăng hiệu suất.
1.2 GraphQL hoạt động như thế nào?
Khi một client muốn giao tiếp với máy chủ GraphQL (VD: lấy danh sách tên người dùng và email), client sẽ sử dụng phương thức HTTP POST để gửi một truy vấn GraphQL đến máy chủ. Điều này không tuân theo các quy ước tiêu chuẩn của HTTP, vì việc đọc dữ liệu thường được thực hiện bằng phương thức HTTP GET; đây là một điểm khác biệt đáng chú ý trong cách hoạt động của GraphQL.
Khi máy chủ (GraphQL Server) nhận được truy vấn, nó sẽ xử lý bằng cách sử dụng một trình phân tích truy vấn (query parser). Trình phân tích này sẽ đọc và xác thực rằng truy vấn được định dạng đúng và máy chủ có thể hỗ trợ nó. Việc xác thực bao gồm kiểm tra truy vấn với GraphQL Schema của ứng dụng, nếu truy vấn hợp lệ, nó sẽ được xử lý bởi các hàm resolver (resolver functions), chịu trách nhiệm tạo phản hồi cho truy vấn của client.
1.3 GraphQL cung cấp các tính năng gì?
Nhiều công ty lớn như Facebook, Atlassian, GitHub, và GitLab đã sử dụng GraphQL để phục vụ hàng trăm triệu khách hàng trên nhiều nền tảng khác nhau như điện thoại di động, máy tính để bàn, và thậm chí cả TV thông minh. Dưới đây là danh sách các tính năng chính mà GraphQL cung cấp:
- Truy vấn dữ liệu linh hoạt: GraphQL cho phép client xác định chính xác dữ liệu họ cần, tránh việc over-fetching (lấy nhiều dữ liệu hơn cần thiết) và under-fetching (lấy ít dữ liệu hơn cần thiết).
- Endpoint duy nhất: Thay vì sử dụng nhiều endpoint như trong REST, GraphQL chỉ cần một endpoint duy nhất để truy vấn mọi loại dữ liệu.
- Strongly Typed Schema: GraphQL sử dụng một schema định nghĩa rõ ràng các loại dữ liệu, các mối quan hệ giữa chúng, và những thao tác có thể thực hiện.
- Real-time Data: Với GraphQL subscriptions, bạn có thể tạo một subscription cho sự kiện bất kì, giúp người dùng nhận được tin nhắn mới theo thời gian thực mà không cần phải liên tục gửi yêu cầu mới.
- Introspection: GraphQL cung cấp khả năng introspection, cho phép client hỏi server về schema hiện tại, giúp cho việc phát triển và gỡ lỗi dễ dàng hơn.
- Version-free API: Với GraphQL, bạn không cần lo lắng về việc quản lý phiên bản API. Các thay đổi có thể được thêm vào schema mà không cần tạo phiên bản mới, vì client chỉ yêu cầu những dữ liệu mà họ biết.
- Schema Stitching and Federation: Hỗ trợ kết hợp nhiều schema từ các microservices khác nhau thành một schema thống nhất (schema stitching), hoặc tự động hóa quá trình này bằng schema federation.
- Truy vấn dữ liệu phân cấp: GraphQL cho phép client truy vấn dữ liệu theo cấu trúc phân cấp, phản ánh chính xác cách dữ liệu được tổ chức trên server.
2. GraphQL API vs REST API
REST API với bề dày lịch sử lâu đời của mình đã trở thành kiến trúc API phổ biến nhất hiện tại, trong khi GraphQL, một công nghệ mới hơn, mang lại sự linh hoạt và hiệu quả cao trong việc truy vấn dữ liệu. Mỗi giải pháp đều có những ưu điểm riêng, và việc lựa chọn giữa chúng phụ thuộc vào nhu cầu cụ thể của dự án và tổ chức.
2.1 Hiệu suất
REST API có thể gặp vấn đề về over-fetching (lấy dư dữ liệu không cần thiết) và under-fetching (lấy thiếu dữ liệu, cần nhiều yêu cầu để hoàn thành). Điều này có thể làm giảm hiệu suất, đặc biệt khi cần nhiều yêu cầu để lấy đủ dữ liệu.
GraphQL cải thiện hiệu suất bằng cách cho phép client chỉ yêu cầu đúng dữ liệu cần thiết, giảm thiểu over-fetching và under-fetching. Điều này giúp giảm số lượng yêu cầu qua lại giữa client và server, tối ưu hóa hiệu suất.
Ví dụ: Để hiển thị thông tin người dùng và bài đăng của họ trên giao diện, bạn cần gửi nhiều yêu cầu REST đến các endpoint khác nhau, làm tăng thời gian phản hồi tổng thể. Với một truy vấn GraphQL, bạn có thể lấy cả thông tin người dùng và bài đăng của họ trong một yêu cầu duy nhất, giảm tải cho server và tăng tốc độ phản hồi.
2.2 HTTP Status Codes
REST API sử dụng các mã trạng thái HTTP chuẩn để biểu thị kết quả của các yêu cầu. Ví dụ, 200 OK
cho thành công, 404 Not Found
cho không tìm thấy tài nguyên, 500 Internal Server Error
cho lỗi server, v.v. Mỗi endpoint REST có thể trả về nhiều mã trạng thái khác nhau tùy thuộc vào kết quả của yêu cầu.
Trong GraphQL API, máy chủ hầu như luôn trả về mã trạng thái HTTP 200 OK
, ngay cả khi thất bại do lỗi ủy quyền (authorization error) hoặc tài nguyên yêu cầu không tồn tại trên máy chủ. Thay vì sử dụng mã trạng thái HTTP để báo hiệu lỗi, GraphQL sử dụng trường errors
trong phần phản hồi để thông báo cho client về các lỗi này.
Tuy nhiên, nếu có lỗi nghiêm trọng từ phía máy chủ, chẳng hạn như cơ sở dữ liệu bị lỗi hoặc một sự cố nào đó từ backend, GraphQL sẽ trả về mã trạng thái 500 Server Error
để chỉ ra rằng yêu cầu đã thất bại hoàn toàn.
2.3 Phương thức HTTP
REST API sử dụng các phương thức HTTP khác nhau cho các hành động khác nhau, chẳng hạn như:
GET
: Để lấy dữ liệu (read).POST
: Để tạo tài nguyên mới (create).PUT
/PATCH
: Để cập nhật tài nguyên hiện có (update).DELETE
: Để xóa tài nguyên (delete).
GraphQL chủ yếu sử dụng phương thức HTTP POST
cho tất cả các loại yêu cầu (truy vấn dữ liệu, tạo, cập nhật, xóa). Dữ liệu truy vấn được gửi trong phần thân yêu cầu (request body).
2.4 Đường dẫn API Endpoint
REST API sử dụng nhiều endpoint khác nhau để truy cập vào các tài nguyên khác nhau. Ví dụ:
/users
để lấy danh sách người dùng./users/{id}
để lấy chi tiết của một người dùng cụ thể./posts/{id}
để lấy một bài đăng cụ thể.
GraphQL chỉ sử dụng một endpoint duy nhất cho tất cả các truy vấn. Ví dụ, endpoint có thể là /graphql
. Mọi yêu cầu đều được gửi đến cùng một endpoint, và dữ liệu đầu vào được xác định cụ thể trong phần thân yêu cầu.
2.5 Ràng buộc Schema
REST API không có một schema rõ ràng và bắt buộc user phải tuân thủ, dữ liệu trả về có thể thay đổi tùy thuộc vào thiết kế của từng endpoint. Điều này có thể gây khó khăn trong việc đảm bảo tính nhất quán và kiểm soát dữ liệu.
GraphQL có một schema mang tính ràng buộc mạnh mẽ, xác định rõ các kiểu dữ liệu, mối quan hệ giữa chúng và các thao tác có thể thực hiện. Điều này đảm bảo rằng mọi truy vấn đều phải tuân thủ theo schema, giúp duy trì tính nhất quán và bảo mật.
3. Kết luận
GraphQL được thiết kế để giải quyết những vấn đề mà Facebook gặp phải với các hệ thống API truyền thống như REST, bằng cách cho phép client truy vấn chính xác những dữ liệu mà họ cần từ server chỉ trong một yêu cầu duy nhất.
Điều này không chỉ giúp cải thiện hiệu suất tương tác giữa client và server mà còn giảm bớt gánh nặng cho server bằng cách tránh truyền tải dữ liệu không cần thiết. Hy vọng bài viết đã giúp bạn hiểu hơn về sự ra đời của GraphQL và sự khác biệt của nó với REST API.
Các bài viết liên quan tại Blog 200Lab:
Bài viết liên quan
Hướng dẫn tích hợp Redux và React Query trong dự án React Vite
Nov 22, 2024 • 8 min read
Giới thiệu Kiến trúc Backend for Frontend (BFF)
Nov 16, 2024 • 10 min read
Flask là gì? Hướng dẫn tạo Ứng dụng Web với Flask
Nov 15, 2024 • 7 min read
Webhook là gì? So sánh Webhook và API
Nov 15, 2024 • 8 min read
Spring Boot là gì? Hướng dẫn Khởi tạo Project Spring Boot với Docker
Nov 14, 2024 • 6 min read
Two-Factor Authentication (2FA) là gì? Vì sao chỉ Mật khẩu thôi là chưa đủ?
Nov 13, 2024 • 7 min read