Là một developer chắc hẳn bạn không còn xa lạ gì với khái niệm Rest API. Những đã bao giờ bạn tìm hiểu những khó khă và hạn chế khi làm việc với Rest API chưa? Và có một tiêu chuẩn nào đó để xây dựng API ngoài Rest API không? Trong bài viết ngày hôm nay, mình sẽ giới thiệu đến các bạn một ngôn ngữ xây dựng API, đó là GraphQL.
1. GraphQL là gì?
GraphQL là một API standard mới cung cấp một giải pháp thay thế hiệu quả, mạnh mẽ và linh hoạt hơn cho REST. Nó là open source được phát triển bởi Facebook và duy trì bởi một cộng đồng lớn trên thế giới. GraphQL cho phép tìm và tải dữ liệu đã khai báo trong đó Client có thể chỉ định chính xác dữ liệu mà nó cần từ một API. Thay vì nhiều end-point trả về cấu trúc dữ liệu cố định, GraphQL server chỉ định nghĩa một end-point duy nhất và response chính xác dữ liệu mà Client request.
Khi nhắc đến GraphQL nhiều người sẽ lầm tưởng rằng nó là một loại cơ sở dữ liệu nhưng thực chất nó là một ngôn ngữ truy vấn cho các API. GraphQL được phát trển cả phía server để thực thi các truy vấn trong quá trình runtime bằng cách sử dụng type đã xác định cho dữ liệu mà Client có thể request được. Một lợi thế của GraphQL là nó hỗ trợ mọi ngôn ngữ lập trình và framework.
2. Vì sao nên sử dụng GraphQL?
GraphQL được phát triển để đáp ứng nhu cầu linh hoạt và hiệu quả hơn, nó giải quyết nhiều thiếu sót và kém hiệu quả mà các nhà phát triển gặp phải khi tương tác với các API REST.
Ví dụ: Trong một ứng dụng viết blog, ứng dụng cần hiển thị title của các post của một user cụ thể. Màn hình tương tự cũng hiển thị tên của 3 user theo follow cùng của user đó. Tình huống đó sẽ được giải quyết như thế nào với REST và GraphQL?
Khi thực hiện với Rest API:
Với REST API, việc thu thập dữ liệu thường được thực hiện bằng cách truy cập nhiều end-point.
-
Trong ví dụ, GET: /users /<id> để tìm nạp dữ liệu của user.
-
Sau đói gọi GET: /users/<id>/posts để trả về dữ liệu bài đăng.
-
Tiếp tục gọi GET: /users/<id>/follower trả về danh sách những user theo dõi user đó. Các bạn có thể thấy với REST, phải thực hiện ba yêu cầu tới các end-point khác nhau để tìm nạp dữ liệu cần thiết và cũng đang tìm nạp quá mức vì các end-point trả về thông tin bổ sung không cần thiết.
Khi thực hiện với GraphQL API:
Vậy nhìn vào ví dụ bên trên bạn có thể thấy, GraphQL linh hoạt hơn rất nhiều so với Rest API, không cần nhiều endpoint để tìm nạp dữ liệu cần thiết cho Client, chỉ cần một end-point duy nhất và gửi lên các field yêu cầu, Server sẽ trả về cho bạn. Vậy một số hạn chế mà RestAPI đang gặp phải như:
- Một trong những vấn đề phổ biến nhất với REST là tìm nạp quá mức hoặc không đầy đủ do Client chỉ có thể tải xuống dữ liệu bằng các end point cụ thể và trả về cấu trúc dữ liệu cố định.
- Client phải tải xuống nhiều thông tin hơn mức thực tế được yêu cầu trong ứng dụng.
- Client sẽ phải thực hiện các yêu cầu bổ sung để tìm nạp mọi thứ mà nó cần.
- Hạn chế là khi Client muốn thêm một vài field khác để hiện thị lên màn hình nhưng response của rest api như thiết kế ban đầu không có các field đó khiên Backend phải bổ sung logic.
- Rất khó để thiết kế API theo cách có thể cung cấp cho Client theo nhu cầu dữ liệu chính xác.
3. Architecture
GraphQL server with a connected database.
Với kiến trúc này cần một server tích hợp GraphQL và kết nối với cơ sở dữ liệu hiện có. Khi một truy vấn được gửi đến, Server sẽ đọc payload của truy vấn đó và thực hiện truy vấn thông tin cần thiết từ cơ sở dữ liệu và nó được gọi là resolving. Sau đó, nó xây dựng response object như được mô tả trong official specification và trả lại nó cho Client. GraphQL là một transport-layer agnostic nên nó có thể triển khai một server với bất kỳ giao thức network nào như TCP, Websocket,... GraphQL cũng không quan tâm đến loại cơ sở dữ liệu là gì, có thể tích hợp nó với SQL hoặc NoSQL.
GraphQL layer that integrates existing systems.
Cho phép xây dựng một server GraphQL tích hợp với nhiều hệ thống sẵn có và giao tiếp với Client thông qua GraphQL API. Kiến trúc này phù hợp với nhiều hệ thống sử dụng cơ sở hạ tầng cũ hoặc những hệ thống đã phát triển từ nhiều năm và gánh nặng nhiều về việc bảo trì. Đồng thời có một số vấn đề mà các hệ thống cũ đang gặp phải như không thể truy cập vào nhiều hệ thống khác nhau. Để giải quyết các vấn đề trên, GraphQL được sử dụng để thống nhất các hệ thống hiện có này và che giấu sự phức tạp của chúng đằng sau một API GraphQL đẹp mắt. Với cách trên, Client chỉ cần giao tiếp với server GraphQL để tìm nạp dữ liệu cần thiết mà không phải thiết lập kết nối với nhiều hệ thống. Sau đó server GraphQL sẽ tìm nạp dữ liệu từ các hệ thống có sẵn và đóng gói chúng trong response object trả về cho Client. Ở trường hợp này, GraphQL cũng không quan tâm đến loại cơ sở dữ liệu và hệ thống mà nó tìm nạp dữ liệu.
Hybrid approach with connected database and integration of existing system.
Với trường hợp này, GraphQL là một server đứng giữa được tích hợp với một cơ sở dữ và kết nối với các hệ thống khác cho phép Client giao tiếp tìm nạp dữ liệu cần thiết. Khi Server GraphQL nhận được một truy vấn, nó sẽ tìm nạp dữ liệu từ cơ sở dữ liệu có sẵn hoặc tìm nạp dữ liệu với các hệ thống mà nó kết nối. Sau đó server GraphQL sẽ tìm nạp dữ liệu từ các hệ thống có sẵn và đóng gói chúng trong response object trả về cho Client. Ở trường hợp này, GraphQL cũng không quan tâm đến loại cơ sở dữ liệu và hệ thống mà nó tìm nạp dữ liệu.
Tổng kết.
Trong bài viết này, mĩnh đã giới thiệu đến các bạn tổng quan về GraphQL cũng như một số bài toán mà nó giải quyết được thay cho RestAPI. Ở bài viết sau, mình sẽ giới thiệu chi thiết hơn về các khái niệm cũng như demo về GraphQL cho các bạn nhé.