---
description: >-
  https://lehuuquangvinh.medium.com/graphql-l%C3%A0-g%C3%AC-t%C3%ACm-hi%E1%BB%83u-v%E1%BB%81-graphql-e5e49b5f1b75
---

# GraphQL là gì? Tìm hiểu về GraphQL (ok)

GraphQL là một từ khóa bạn sẽ thường gặp nếu bạn tìm hiểu về việc truy vấn dữ liệu, đặc biệt với các dự án liên quan đến Web3. Vậy cùng tìm hiểu về GraphQL nhé.

## 1. GraphQL là gì? <a href="#be9f" id="be9f"></a>

GraphQL, viết tắt của Graph Query Language, là một ngôn ngữ truy vấn dữ liệu cho API hiệu quả, mạnh mẽ và mang tính linh hoạt cao.![Image for post](https://miro.medium.com/max/60/1*OR0NVxTEYsjiCuRUMI-idw.png?q=20)

![Image for post](https://miro.medium.com/max/2065/1*OR0NVxTEYsjiCuRUMI-idw.png)

Cụ thể với GraphQL, khi client gửi yêu cầu cần dữ liệu đến server thì cấu trúc dữ liệu trả về sẽ không khô cứng mà sẽ linh hoạt thay đổi theo cách phía client yêu cầu những dữ liệu gì. Trước đó, những thông tin định dạng và định nghĩa sẽ được mô tả sẵn ở server rồi nên khi gửi yêu cầu dữ liệu lên server thì chỉ cần 1 endpoint duy nhất.

Nói cách khác, GraphQL cung cấp mô tả đầy đủ và dễ hiểu về dữ liệu trong API của bạn, cung cấp cho phía khách (client) khả năng yêu cầu chính xác những gì họ cần mà không cần dư thừa, giúp việc phát triển API dễ dàng hơn theo thời gian và cho phép các công cụ mạnh mẽ dành cho nhà phát triển.

_**Funfact**: GraphQL được phát triển bởi đội ngũ Facebook, sau đó công khai mã nguồn mở cho thế giới và hiện đang được duy trì bởi 1 cộng lớn gồm nhiều công ty và cá nhân trên thế giới._

## 2. Cấu trúc của GraphQL. <a href="#id-36bc" id="id-36bc"></a>

GraphQL API có 3 phần chính :



* **1. Queries (Truy vấn)**: Truy vấn là yêu cầu mà phía client đưa ra, cụ thể là Các câu lệnh lấy dữ liệu (tương tự method GET trong REST API)

```
{
  hero {
    name
    height
  }
}
```

* **2. Resolvers:** Resolver là thứ giúp phía server hiểu được cần làm gì/đưa ra thông tin gì, ở đâu, để phản hồi lại yêu cầu truy vấn phía trên của client. Ngoài ra, với GraphQL, schema của API và schema của cơ sở dữ liệu bạn sử dụng được tách rời. Điều này cho phép bạn sử dụng chúng như mutation resolvers để sửa đổi nội dung cơ sở dữ liệu của bạn.
* **3. Schema (Lược đồ**): Một GraphQL schema mô tả các chức năng mà phía client có thể sử dụng khi chúng kết nối với server GraphQL. Mỗi đơn vị cấu thành schema được gọi là 1 type.

## 3. Đặc điểm của GraphQL <a href="#id-192d" id="id-192d"></a>

### 3.1 Hiệu quả, mạnh mẽ & tiện lợi <a href="#id-2f91" id="id-2f91"></a>

Để bạn dễ hình dung về điểm mạnh của GraphQL, chúng ta cần nói đến REST (Representational State Transfer) — loại giao thức API phổ biến mà GraphQL muốn hướng đến thay thế.

Trước khi có GraphQL, các lập trình viên thường sử dụng REST để truy vấn dữ liệu. Tuy nhiên, vấn đề của REST là dữ liệu của nó thường sẽ trả về quá nhiều, dư thừa so với thông tin được yêu cầu; có khi lại quá ít. Dù là trường hợp nào thì hiệu suất của ứng dụng cũng sẽ bị ảnh hưởng rất nhiều.

Với GraphQL thì bạn yêu cầu thông tin nào từ API thì chỉ sẽ ra đúng thứ bạn cần, không hơn không kém.

### 3.2 Tính năng Defining Schema (Xác định Schema) và Type System (Kiểu Hệ thống) <a href="#id-5c4d" id="id-5c4d"></a>

GraphQL có 1 hệ thống riêng dành cho nó được sử dụng để xác định schema của một api. Tất cả type được liệt kê trong một API thì được viết trong schema thì sử dụng GraphQL Schema Definition Language (SDL) (SDL là cách ngắn gọn nhất để kê khai thông tin trong một GraphQL schema. Thực chất, SDL là một phần trong đặc tả GraphQL chính thức).

Bạn có thể hiểu schema này như là bản quy định giữa 2 phía client và server để xác định cách client truy cập dữ liệu từ client như thế nào.

```
type Query {
hero: Character
}
type Character {
name: String
friends: [Character]
homeWorld: Planet
species: Species
}
```

### 3.3 Fetching Data (Query) <a href="#id-19eb" id="id-19eb"></a>

Cách GraphQL nạp dữ liệu khác với REST.

GraphQL API vs REST API

![GraphQL API vs REST API](https://miro.medium.com/max/1423/1*34h3D92XL_TZj_y-Pjr5yw.jpeg)

Trong REST thì mỗi nguồn thông tin là 1 endpoint, với mỗi endpoint bạn phải thực hiện 1 lệnh gọi dữ liệu khác nhau, và dữ liệu mỗi endpoint trả về sẽ có thể nhiều hơn hoặc ít hơn dữ liệu bạn yêu cầu. Trong khi đó, với GraphQL, bạn chỉ cần thực hiện lệnh gọi đến 1 endpoint và hệ thống sẽ làm hết phần còn lại, trả về thông tin của 3 nguồn cho bạn.



### 3. 4 Ngoài ra, <a href="#faf7" id="faf7"></a>

* Với GraphQL, bạn có thể tạo thêm, xóa hoặc cập nhật vào cơ sở dữ liệu.
* GraphQL tương thích với các cơ sở dữ liệu phổ biến hiện nay.
* GraphQL cung cấp websocket giúp việc phía client có thể lắng nghe dữ liệu từ server dễ dàng hơn cũng như phát triền các ứng dụng thời gian thực trở nên dễ dàng hơn.

## 4. Ví dụ 1 GraphQL <a href="#id-9f21" id="id-9f21"></a>

Ví dụ bên dưới tôi đang yêu cầu thông tin của 5 dự án và 5 loại (categories) đầu tiên từ subgraph [Everest](https://lehuuquangvinh.medium.com/everest-s%E1%BB%B1-kh%E1%BB%9Fi-%C4%91%E1%BA%A7u-c%E1%BB%A7a-danh-t%C3%ADnh-d%E1%BB%B1-%C3%A1n-89bfbdf02c37) xây dựng trên giao thức mạng [The Graph](https://lehuuquangvinh.medium.com/the-graph-protocol-grt-l%C3%A0-g%C3%AC-t%C3%ACm-hi%E1%BB%83u-v%E1%BB%81-the-graph-protocol-grt-a0b33bdcc568).![Image for post](https://miro.medium.com/max/60/1*3SMdlUNLyWJ_zwTlTrEi-Q.png?q=20)

![Image for post](https://miro.medium.com/max/3083/1*3SMdlUNLyWJ_zwTlTrEi-Q.png)

The Graph Protocol là 1 dự án là một giao thức để tổ chức dữ liệu blockchain và giúp nó dễ dàng truy cập. Nó hiện đang hỗ trợ cho nhiều ứng dụng được sử dụng nhiều nhất trong DeFi và hệ sinh thái Web3 rộng lớn hơn hiện nay. Các Subgraph trong mạng The Graph cho phép người dùng sử dụng ngôn ngữ truy vấn GraphQL để truy vấn dữ liệu từ chúng.

![](https://2726517656-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M1E4Gk2ppVKb4olmnun%2F-MUGhiOD_F__ZMEm6nQk%2F-MUGvr5RXckUqk0eASM0%2FScreenshot_1.jpg?alt=media\&token=b2fd6766-e8e5-45dd-bf55-7e97ad32c58b)

Tìm hiểu thêm về The Graph tại: [https://thegraph.com/](https://thegraph.com/)
