GraphQL là một ngôn ngữ truy vấn và thao tác dữ liệu dành cho API, cho phép các API Consumer yêu cầu chính xác dữ liệu họ cần từ server
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.
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.
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.
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:
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.
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.
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.
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).
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.
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.
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.
You need to login in order to like this post: click here
YOU MIGHT ALSO LIKE