Hướng dẫn GraphQL cho người mới bắt đầu: Là gì, tính năng và ví dụ

⚡ Tóm tắt thông minh

GraphQL là một ngôn ngữ truy vấn phía máy chủ cho phép máy khách yêu cầu chính xác dữ liệu cần thiết chỉ trong một lần gọi. Trang này giải thích các thành phần chính, truy vấn, biến, thao tác cập nhật dữ liệu (mutations), đăng ký (subscriptions) và sự khác biệt giữa GraphQL và REST.

  • 🧠 Định nghĩa: GraphQL là một công nghệ ở lớp ứng dụng, thực thi các truy vấn khai báo trên dữ liệu hiện có.
  • 🧩 Thành phần chính: Một truy vấn yêu cầu dữ liệu, một bộ giải quyết sẽ lấy dữ liệu đó, và một lược đồ định nghĩa những gì có thể được yêu cầu.
  • 🎯 Cuộc gọi đơn: Một yêu cầu duy nhất sẽ trả về tất cả các trường cần thiết, giúp loại bỏ tình trạng lấy dữ liệu thừa hoặc thiếu.
  • 🔤 Biến: Các giá trị động được khai báo riêng biệt và truyền dưới dạng từ điển thay vì được tích hợp vào chuỗi truy vấn.
  • ✏️ Đột biến: Thao tác mutation chèn, cập nhật hoặc xóa dữ liệu và trả về giá trị đã được sửa đổi.
  • 📡 Đăng ký: Việc đăng ký duy trì kết nối để máy chủ có thể gửi các bản cập nhật ngay khi chúng được phát hành.
  • ⚖️ Chống lại REST: GraphQL hoạt động dựa trên phía máy khách và lược đồ, trong khi REST hoạt động dựa trên phía máy chủ và điểm cuối.

Hướng dẫn GraphQL dành cho người mới bắt đầu

GraphQL là gì?

GraphQL GraphQL là một công nghệ phía máy chủ thuộc lớp ứng dụng, được phát triển bởi Facebook (nay là Meta) để thực hiện các truy vấn với dữ liệu hiện có. Nó được phát hành rộng rãi vào năm 2015 và được quản lý bởi GraphQL. Foundation Từ năm 2018, GraphQL có thể tối ưu hóa các cuộc gọi API RESTful. Nó cung cấp một cách khai báo để lấy và cập nhật dữ liệu của bạn. GraphQL giúp bạn tải dữ liệu từ máy chủ xuống máy khách. Nó cho phép lập trình viên lựa chọn loại yêu cầu mà họ muốn thực hiện.

Bạn cần học những gì trước khi học GraphQL?

Hướng dẫn GraphQL này dựa trên ExpressNodeJ. Do đó, bạn có thể học GraphQL rất dễ dàng với sự hiểu biết cơ bản về NodeJS.

Tại sao nên sử dụng GraphQL?

Sau đây là những lý do nên sử dụng GraphQL:

  • Nó cung cấp một truy vấn có thể đọc được.
  • Trong GraphQL, việc làm việc với nhiều cơ sở dữ liệu rất dễ dàng.
  • Phù hợp với các dịch vụ siêu nhỏ và hệ thống phức tạp.
  • Bạn có thể tìm nạp dữ liệu chỉ bằng một lệnh gọi API.
  • Nó giúp bạn xử lý các truy vấn và bộ nhớ đệm.
  • Bạn không gặp phải vấn đề lấy quá nhiều hoặc quá ít hàng.
  • Điều chỉnh yêu cầu theo nhu cầu của bạn.
  • Nó giúp bạn khám phá lược đồ ở định dạng thích hợp.
  • GraphQL tự động đồng bộ hóa tài liệu với những thay đổi của API.
  • Có thể tiến hóa API mà không cần lập phiên bản.
  • Các trường GraphQL được sử dụng trong nhiều truy vấn có thể được chia sẻ lên cấp thành phần cao hơn để sử dụng lại.
  • Bạn có thể chọn chức năng nào sẽ hiển thị và cách chúng hoạt động.
  • Nó có thể được sử dụng để tạo mẫu ứng dụng nhanh.ping.

Ứng dụng của GraphQL

Dưới đây là các ứng dụng quan trọng của GraphQL:

  • Nó cung cấp Rơle và các khung máy khách khác
  • GraphQL giúp bạn cải thiện hiệu suất của ứng dụng di động.
  • Nó có thể giảm vấn đề tìm nạp quá mức để hạ thấp dịch vụ đám mây phía máy chủ và giảm mức sử dụng mạng, phía máy khách.
  • Nó có thể được sử dụng khi ứng dụng khách phải chỉ định trường nào là cần thiết ở định dạng truy vấn dài.
  • GraphQL có thể được tận dụng tối đa khi bạn phải thêm chức năng vào API cũ hoặc API hiện có của mình.
  • Nó được sử dụng khi bạn phải đơn giản hóa API phức tạp.
  • Trộn và trộn mẫu mặt tiền, thường được sử dụng trong lập trình hướng đối tượng.
  • Khi bạn phải tổng hợp dữ liệu từ nhiều nơi vào một API tiện lợi.
  • Bạn có thể sử dụng GraphQL như một công cụ tuyệt đối.tracĐiều chỉnh API hiện có để xác định cấu trúc phản hồi dựa trên nhu cầu của người dùng.

Những lợi ích đó đều dựa trên ba yếu tố vận hành đồng bộ.

Các thành phần chính của GraphQL

Bây giờ trong hướng dẫn GraphQL này, hãy cùng tìm hiểu các thành phần chính của GraphQL:

Các thành phần chính của GraphQL
Các thành phần chính của GraphQL

Như được hiển thị trong hình trên, có ba thành phần chính của GraphQL: 1) Truy vấn, 2) Trình phân giải và 3) Lược đồ.

Câu Hỏi

Truy vấn là một yêu cầu API được thực hiện bởi ứng dụng máy khách. Nó hỗ trợ tăng cường và trỏ tới mảng. Truy vấn được sử dụng để đọc hoặc tìm nạp các giá trị.

Các phần của truy vấn:

Sau đây là những phần quan trọng của Query

  1. Cánh đồng:

Một trường (field) đơn giản chỉ ra rằng chúng ta đang yêu cầu máy chủ cung cấp thông tin cụ thể. Sau đây là một ví dụ về trường trong truy vấn GraphQL.

query {
    team {
        id
        name
    }
}

Máy chủ phản hồi bằng một tài liệu JSON có cấu trúc tương tự như truy vấn:

{
    "data": {
        "team": [
            {
                "id": 1,
                "name": "Avengers"
            }
        ]
    }
}

Trong ví dụ GraphQL ở trên, chúng ta yêu cầu máy chủ trả về trường có tên là "team" và các trường con của nó như "id" và "name". Máy chủ GraphQL trả về chính xác dữ liệu mà chúng ta yêu cầu.

  1. Lập luận

In REST củaChúng ta chỉ có thể truyền một tập hợp các đối số duy nhất. URL các phân đoạn và tham số truy vấn. Để lấy một hồ sơ cụ thể, một lệnh gọi REST điển hình sẽ trông như sau:

GET /api/team?id=2
Content-Type: application/json

{
    "id": 2,
    "name": "Justice League"
}

Giải quyết

Trình phân giải cung cấp hướng dẫn để chuyển đổi thao tác GraphQL thành dữ liệu. Chúng giải quyết truy vấn dữ liệu bằng cách xác định các hàm phân giải.

Nó hiển thị cho máy chủ quy trình cũng như vị trí để tìm nạp dữ liệu theo một trường cụ thể. Trình phân giải cũng tách lược đồ cơ sở dữ liệu và lược đồ API. Các thông tin được tách biệt giúp sửa đổi nội dung thu được từ cơ sở dữ liệu.

Schema

Lược đồ GraphQL là trung tâm của việc triển khai GraphQL. Nó mô tả chức năng có sẵn cho các máy khách đang kết nối với nó.

Các tính năng của GraphQL

Dưới đây là các tính năng quan trọng của GraphQL:

  • Nó cung cấp ngôn ngữ truy vấn khai báo, không bắt buộc.
  • Nó mang tính phân cấp và tập trung vào sản phẩm.
  • GraphQL được gõ mạnh. Nó có nghĩa là các truy vấn được thực hiện trong ngữ cảnh của một hệ thống cụ thể.
  • Các truy vấn trong GraphQL được mã hóa trong máy khách chứ không phải trong máy chủ.
  • Nó có tất cả các tính năng của lớp ứng dụng của mô hình OSI.

Khách hàng GraphQL

Máy khách GraphQL là mã thực hiện các yêu cầu POST tới Máy chủ GraphQL có liên quan. Bạn có thể truy vấn trực tiếp API GraphQL, nhưng cách tiếp cận tốt là tận dụng thư viện máy khách chuyên dụng bằng cách sử dụng Relay.

T JavaThư viện tập lệnh được Facebook phát triển để tạo ứng dụng React với GraphQL. Máy khách GraphQL có thể là CMS như Drupal, ứng dụng một trang, ứng dụng di động, v.v.

Máy chủ GraphQL

Máy chủ GraphQL là các triển khai phía máy chủ của đặc tả GraphQL. Nó mô tả dữ liệu của bạn dưới dạng API GraphQL, mà chương trình phía máy khách của bạn có thể truy vấn để lấy thông tin. cơ sở dữ liệu.

Cổng GraphQL

Gateway là một mô hình kiến ​​trúc microservice cho phép bạn xây dựng một dịch vụ riêng biệt để xử lý các dịch vụ backend khác. Nó cung cấp tài liệu hướng dẫn dễ hiểu và một cách thuận tiện để thu thập dữ liệu từ nhiều nguồn khác nhau chỉ với một yêu cầu duy nhất.

Biến trong GraphQL là gì?

A Biến trong GraphQL được sử dụng để tách các giá trị động khỏi truy vấn máy khách và chuyển truy vấn dưới dạng từ điển duy nhất. Biến trong GraphQL cũng có thể được sử dụng để sử dụng lại truy vấn hoặc các đột biến do máy khách viết bằng các đối số riêng lẻ. Trong graphQL, bạn không thể truyền trực tiếp các đối số động vào chuỗi truy vấn. Lý do là mã phía máy khách cần thao tác chuỗi truy vấn một cách linh hoạt tại thời điểm bạn chạy chương trình.

GraphQL có một cách hay để tách các giá trị động ra khỏi truy vấn. Nó truyền chúng dưới dạng một từ điển riêng biệt. Các giá trị này được gọi là biến. Bất cứ khi nào làm việc với biến, chúng ta cần thực hiện ba điều sau:

  1. Thay thế giá trị tĩnh trong truy vấn bằng tên biến.
  2. Khai báo tên biến là một trong các biến được truy vấn GraphQL chấp nhận.
  3. Truyền giá trị vào từ điển các biến dành riêng cho việc vận chuyển.

Đây là toàn bộ đoạn mã. Đầu tiên là truy vấn, dùng để khai báo biến:

query HeroNameAndFriends($episode: Episode) {
    hero(episode: $episode) {
        name
        friends {
            name
        }
    }
}

Tiếp theo là từ điển riêng biệt chứa các giá trị biến được gửi kèm theo:

{
    "episode": "JEDI"
}

Và đây là phản hồi mà máy chủ trả về:

{
    "data": {
        "hero": {
            "name": "R2-D2",
            "friends": [
                { "name": "Luke Skywalker" },
                { "name": "Han Solo" },
                { "name": "Leia Organa" }
            ]
        }
    }
}

Như bạn có thể thấy trong ví dụ về GraphQL ở trên, chúng tôi chỉ truyền một biến khác ngoài việc cần tạo một truy vấn mới.

Đột biến là gì?

Đột biến là một cách để thay đổi tập dữ liệu trong GraphQL. Nó sửa đổi dữ liệu trong kho dữ liệu và trả về một giá trị. Đột biến giúp bạn chèn, cập nhật hoặc xóa dữ liệu. Nói chung, các đột biến được định nghĩa là một phần lược đồ.

Những điểm cần cân nhắc khi thiết kế đột biến GraphQL

Dưới đây là những điểm quan trọng khi thiết kế GraphQL:

  • Đặt tên: Trước hết, bạn phải đặt tên cho động từ đột biến của mình. Sau đó là danh từ hoặc “tân ngữ” nếu có. Sử dụng CamelCase khi đặt tên cho các đột biến.
  • Tính cụ thể: Bạn phải tạo ra đột biến cụ thể càng nhiều càng tốt. Đột biến phải thể hiện các hành động ngữ nghĩa được thực hiện bởi người dùng.
  • Đối tượng đầu vào: Sử dụng một loại đối tượng đầu vào, duy nhất, bắt buộc, làm đối số để thực hiện đột biến trên máy khách.
  • Loại tải trọng duy nhất: Bạn nên sử dụng một loại tải trọng duy nhất cho mỗi đột biến. Bạn cũng có thể thêm đầu ra đột biến dưới dạng trường cho loại tải trọng cụ thể đó.
  • Làm tổ: Sử dụng tính năng lồng vào đột biến của bạn ở bất cứ nơi nào có ý nghĩa. Nó cho phép bạn sử dụng đầy đủ API GraphQL.

Các truy vấn đọc và các thao tác thay đổi ghi. Loại thao tác thứ ba bao gồm dữ liệu thay đổi trong khi máy khách vẫn đang kết nối.

Trong GraphQL, Subscription là gì?

A đăng ký Subscribe là loại thao tác thứ ba trong đặc tả GraphQL, bên cạnh truy vấn (query) và thay đổi dữ liệu (mutation). Một truy vấn và một thay đổi dữ liệu đều hoàn thành trong một yêu cầu và một phản hồi duy nhất. Ngược lại, subscription duy trì một kết nối mở trong thời gian dài, thường là qua WebSockets, để máy chủ đẩy một kết quả mới đến máy khách mỗi khi một sự kiện được chỉ định xảy ra.

Cú pháp này tương tự như một truy vấn, trong đó từ khóa `subscription` thay thế cho truy vấn:

subscription OnCommentAdded($postId: ID!) {
    commentAdded(postId: $postId) {
        id
        content
        author {
            name
        }
    }
}

Trên thực tế, có ba điểm khác biệt giữa các loại hình đăng ký.

  • Dựa trên sự kiện, không phải dựa trên thăm dò ý kiến: Máy khách chỉ đăng ký sự quan tâm một lần. Không có thông tin nào khác được gửi đi cho đến khi máy chủ công bố một sự kiện phù hợp, điều này tiết kiệm chi phí hơn nhiều so với việc thăm dò liên tục.
  • Mỗi gói đăng ký chỉ có một trường gốc: Thông số kỹ thuật chỉ cho phép một trường cấp cao nhất duy nhất, không giống như truy vấn có thể yêu cầu nhiều trường cùng một lúc.
  • Tốt nhất nên giữ quy mô nhỏ: Chỉ nhấn vào những trường mà giao diện cần làm mới. Trò chuyện trực tiếp, thông báo và hiển thị giá là những trường hợp sử dụng điển hình.

Sự khác biệt giữa GraphQL và REST

Bảng sau đây cho thấy sự khác biệt quan trọng giữa GraphQL và REST.

GraphQL REST của
Nó tuân theo kiến ​​trúc hướng tới khách hàng. Nó tuân theo kiến ​​trúc do máy chủ điều khiển.
GraphQL có thể được tổ chức theo một lược đồ. REST có thể được tổ chức theo điểm cuối.
GraphQL là một cộng đồng đang phát triển. REST là một cộng đồng rất lớn.
Tốc độ phát triển trong GraphQL rất nhanh. Tốc độ phát triển trong REST chậm.
Quá trình học GraphQL khá gian nan. Quá trình học tập trong REST ở mức vừa phải.
Danh tính được tách biệt khỏi cách bạn tìm nạp nó. Điểm cuối bạn gọi trong REST là danh tính của một đối tượng cụ thể.
Trong GraphQL, phía máy khách sẽ quyết định các trường dữ liệu mà nó nhận được. Hình dạng và kích thước của tài nguyên được xác định bởi máy chủ trong REST.
GraphQL cung cấp tính nhất quán cao trên tất cả các nền tảng. Thật khó để có được sự nhất quán trên tất cả các nền tảng.

Nhược điểm của GraphQL

Dưới đây là những nhược điểm của GraphQL:

  • Hệ sinh thái trẻ
  • Thiếu tài nguyên ở phần phụ trợ.
  • Thiếu mẫu thiết kế cho một ứng dụng phức tạp.
  • Các vấn đề về hiệu suất với các truy vấn phức tạp.
  • Quá mức cần thiết cho các ứng dụng nhỏ
  • GraphQL không phụ thuộc vào các phương thức bộ nhớ đệm HTTP cho phép lưu trữ nội dung yêu cầu.
  • GraphQL không hiểu tệp. Do đó, tính năng tải tệp lên không được bao gồm trong đó.
  • Với GraphQL, hãy chuẩn bị sẵn sàng để có nhiều kiến ​​thức trước khi phát triển như học Ngôn ngữ Định nghĩa Lược đồ.

Các ứng dụng và công cụ nguồn mở được GraphQL sử dụng

Các ứng dụng và công cụ nguồn mở quan trọng được GraphQL sử dụng như sau:

  • GatsbyGatsby là một ứng dụng được hỗ trợ bởi GraphQL, có thể sử dụng dữ liệu được lấy từ nhiều nguồn API GraphQL khác nhau. Bạn có thể sử dụng nó để phát triển ứng dụng React tĩnh và ứng dụng React phía máy khách.
  • GraphiQL: Đây là một IDE tích hợp với trình duyệt và tương tác với API của GraphQL. Một số chức năng mà GraphiQL bao gồm là các thao tác thay đổi dữ liệu (mutations), truy vấn dữ liệu và tự động hoàn thành truy vấn.
  • Sân chơi GraphQL: Đây là một IDE mạnh mẽ với trình soạn thảo tích hợp sẵn để xử lý các thao tác thay đổi dữ liệu, xác thực, truy vấn GraphQL, đăng ký, v.v. Nhà phát triển có thể sử dụng IDE này để hình dung cấu trúc của lược đồ. Dự án hiện đã ngừng hoạt động và các tính năng của nó đã được tích hợp trở lại vào GraphiQL.
  • Prisma: Prisma là một cơ sở dữ liệu.tracLớp giao diện, hiện được cung cấp dưới dạng ORM an toàn kiểu dữ liệu, được kết hợp rộng rãi với máy chủ GraphQL để hiển thị các thao tác CRUD (Tạo, Đọc, Cập nhật và Xóa).
  • Một chút: Đây là công cụ và nền tảng nguồn mở giúp chuyển đổi mã có thể tái sử dụng thành các thành phần. Các nhà phát triển có thể sử dụng chúng để chia sẻ và phát triển các dự án khác nhau.

Câu Hỏi Thường Gặp

Không. GraphQL là ngôn ngữ truy vấn dành cho API, không phải cho cơ sở dữ liệu. Nó nằm ở phía trước bất kỳ hệ thống lưu trữ nào bạn đang sử dụng, và các resolver sẽ dịch từng trường thành câu lệnh SQL, lệnh gọi REST hoặc bất kỳ nguồn dữ liệu nào khác.

Hầu hết các yêu cầu đều trả về mã HTTP 200 bất kể kết quả. Các lỗi sẽ xuất hiện trong một mảng lỗi cấp cao bên cạnh trường dữ liệu, vì vậy các máy khách phải kiểm tra phần thân yêu cầu thay vì chỉ dựa vào mã trạng thái.

Một trường lồng nhau có thể kích hoạt một lệnh gọi cơ sở dữ liệu cho mỗi bản ghi cha, vì vậy mười nhóm sẽ gây ra mười một truy vấn. Các thư viện xử lý theo lô như DataLoader sẽ nhóm các lệnh gọi đó thành một yêu cầu duy nhất và loại bỏ điểm nghẽn.

Có. Hãy cung cấp định nghĩa bảng hoặc mẫu JSON và trợ lý AI sẽ soạn thảo các kiểu dữ liệu, trường và mối quan hệ bằng Ngôn ngữ Định nghĩa Lược đồ (Schema Definition Language). RevHãy xem xét khả năng chấp nhận giá trị null và phân trang trước khi sử dụng trong môi trường sản xuất.

Đúng vậy. Hãy cung cấp điểm cuối và một ví dụ về phản hồi, và trợ lý AI sẽ trả về truy vấn tương đương kèm theo cấu trúc phân giải. So sánh cả hai phản hồi từng trường một trước khi thay thế lệnh gọi REST.

Tóm tắt bài viết này với: