GraphQL là gì?
GraphQL là một cách thay thế để giao tiếp với các API phù hợp cho các cấu trúc dữ liệu phức tạp và xây dựng các giao diện trên chúng. Khác với việc coi dữ liệu là những phần riêng biệt, độc lập, GraphQL cho thấy cách các phần dữ liệu kết nối và liên quan đến nhau, giúp dễ dàng yêu cầu và nhận thông tin.
Hãy coi GraphQL như một ngôn ngữ truy vấn cho phép bạn giao tiếp với API như thể bạn đang nói trực tiếp với cơ sở dữ liệu. Sử dụng GraphQL cho phép bạn tiến gần đến cơ sở dữ liệu nhất có thể, cho phép bạn chọn lựa dữ liệu nào bạn muốn và cách bạn lấy nó, cung cấp lợi ích hiệu năng lớn.
GraphQL được tạo bởi Facebook để giải quyết vấn đề mở rộng quy mô với các cấu trúc dữ liệu phức tạp. Do sự áp dụng thành công của họ, ngày càng nhiều công ty nhận ra lợi ích của việc sử dụng GraphQL cho các API của họ.
Đã biết REST? GraphQL sẽ cảm thấy quen thuộc.
GraphQL APIs dễ làm việc hơn bạn có thể nghĩ. Nếu bạn quen với REST APIs, đây là cách các khái niệm cơ bản từ REST chuyển sang GraphQL.
| Tính năng↕ | REST↕ | GraphQL↕ |
|---|---|---|
| Endpoint | Các yêu cầu được gửi đến nhiều endpoint cho các hành động khác nhau | Tất cả các yêu cầu được gửi đến một endpoint duy nhất (ví dụ: /graphql) |
| Truy xuất dữ liệu | Sử dụng phương thức GET trên các endpoint cụ thể để truy xuất dữ liệu | Sử dụng queries để yêu cầu chính xác dữ liệu cần thiết, giảm tải quá mức hoặc tải thiếu |
| Sửa đổi/hành động dữ liệu | Sử dụng các phương thức HTTP như POST, PUT, PATCH hoặc DELETE để sửa đổi hoặc xử lý dữ liệu. | Sử dụng mutations để thực hiện các hoạt động (ví dụ: tạo bên, tính toán chi phí hạ cánh) |
| Định dạng phản hồi | Định dạng phản hồi cố định trả về tất cả các trường được xác định trước, bất kể chúng có cần thiết hay không | Phản hồi linh hoạt cho phép chỉ định chính xác các trường cần bao gồm, giảm truyền dữ liệu không cần thiết (Nếu tính linh hoạt này cảm thấy phức tạp, chỉ cần sử dụng các ví dụ truy vấn được viết sẵn trong tài liệu của chúng tôi để có trải nghiệm giống REST) |
| Kết nối dữ liệu | Thường cần nhiều yêu cầu để lấy dữ liệu liên quan | Các truy vấn lồng nhau cho phép truy xuất dữ liệu liên quan trong một yêu cầu duy nhất (ví dụ: chi tiết bên và mục hàng hóa cùng nhau). Người dùng cũng có thể xây dựng quy trình làm việc để quản lý nhiều mutations trong một yêu cầu GraphQL duy nhất, giảm độ phức tạp và cải thiện hiệu quả |
Ưu điểm của GraphQL
Phản hồi nhanh hơn
GraphQL cung cấp phản hồi nhanh hơn thông qua truy xuất dữ liệu chính xác, sử dụng một endpoint duy nhất và khả năng cải thiện để gộp và bộ nhớ đệm.
Truy xuất dữ liệu chính xác
Một thách thức phổ biến với REST là tải quá mức hoặc tải thiếu dữ liệu—hoặc nhận quá nhiều thông tin không cần thiết hoặc không đủ những gì cần trong một lần. GraphQL loại bỏ điều này bằng cách cho phép yêu cầu chính xác những gì cần—không nhiều hơn, không ít hơn. Đặc điểm này không chỉ cải thiện hiệu năng mà còn đơn giản hóa quá trình cho những người tương tác với API, giúp hệ thống hiệu quả hơn và thân thiện với người dùng hơn.
Ví dụ về cách điều này hữu ích:
- Điều này cho phép các nhà phát triển frontend lấy chính xác dữ liệu họ cần cho các thành phần UI của họ, giảm số lần đi du lịch đến máy chủ và cải thiện hiệu năng.
- Hãy tưởng tượng bạn muốn nhận được một bảng phân loại mã HS, cartonization, xếp hạng vận chuyển và báo giá chi phí hạ cánh trên các mục trong một thanh toán. Nếu bạn tích hợp qua GraphQL API, bạn có thể gọi một cuộc gọi duy nhất với các workflows cần thiết để nhận tất cả những gì bạn cần (và không cần gì bạn không cần) trong một phản hồi duy nhất. Ngược lại, với REST APIs, bạn sẽ cần phải gọi Classify REST API trước, sau đó gọi Rating REST API riêng biệt sau đó, và cuối cùng cắm phân loại đó và xếp hạng vận chuyển vào cuộc gọi thứ ba của bạn đến Landed Cost REST API. Tất cả các REST APIs này sẽ trả về mọi thông tin mà họ có thể, khiến bạn phải phân tích phản hồi để tìm dữ liệu bạn cần. Sự tiết kiệm tốc độ này có tác động trong việc trả lại chi phí hạ cánh hoàn chỉnh nhanh chóng, trước khi người mua rời đi.
Endpoint duy nhất
GraphQL APIs thường có một endpoint duy nhất, không giống như REST APIs thường có nhiều endpoint cho các tài nguyên và hành động khác nhau. Điều này giúp dễ dàng quản lý và hiểu API.
Gộp và bộ nhớ đệm
Khả năng gộp các truy vấn của GraphQL và hỗ trợ cho các chiến lược bộ nhớ đệm dẫn đến cải thiện hiệu năng đáng kể. Các tính năng này giảm tải trên mạng và máy chủ, dẫn đến các tương tác nhanh hơn, đáng tin cậy hơn cho người dùng.
Các lược đồ được xác định rõ
GraphQL APIs dựa trên một lược đồ được gõ mạnh. Lược đồ này xác định cấu trúc của dữ liệu có sẵn và các hoạt động có thể thực hiện. Điều này cung cấp sự rõ ràng về dữ liệu nào có sẵn và cách truy cập nó, có thể cải thiện năng suất nhà phát triển và giảm lỗi. Ví dụ: các nhóm frontend có thể khám phá biểu đồ để lấy chính xác những gì họ cần thay vì chờ một endpoint REST mới.
Khả năng cải thiện mà không phá vỡ các máy khách hiện có
Thêm các tính năng mới hoặc sửa đổi các tính năng hiện có trong GraphQL không làm gián đoạn các tích hợp hiện tại, nhờ cấu trúc truy vấn linh hoạt của nó. Khả năng này đảm bảo rằng các cải thiện có thể được thực hiện mà không phá vỡ khả năng tương thích với các máy khách hiện có.
Tài liệu cập nhật
Nhờ tính năng nội suy của GraphQL, tài liệu được tạo tự động và cập nhật với mọi thay đổi. Điều này đảm bảo rằng tất cả thông tin được cung cấp cho các nhà phát triển hiện tại, giảm các vấn đề tích hợp và các vé hỗ trợ liên quan đến tài liệu lỗi thời—một thách thức thường gặp trong tài liệu REST API.
Xem lại GraphQL documentation và REST documentation của chúng tôi để thấy sự khác biệt.
Một bài so sánh
Hãy tưởng tượng bạn đang ở một nhà hàng với một thực đơn cho phép bạn đặt các món ăn chính xác như bạn muốn, so với một nhà hàng khác nơi bạn chỉ có thể chọn từ các bữa ăn đặt. GraphQL giống như nhà hàng đầu tiên:
- Lấy chính xác những gì bạn muốn: Với GraphQL, bạn có thể yêu cầu chính xác dữ liệu bạn cần, không nhiều hơn, không ít hơn. Hãy tưởng tượng bạn chỉ muốn tên và giá của một món ăn, không phải toàn bộ danh sách thành phần. Với REST APIs, bạn phải nhận toàn bộ chi tiết món ăn và bỏ qua các phần bạn không cần.
- Soạn một món ăn tùy chỉnh: GraphQL API của chúng tôi có thể dễ dàng kết hợp để tạo các giải pháp tùy chỉnh hơn, tương tự như một nhà hàng phong cách buffet nơi bạn có thể tạo một món ăn độc nhất vô nhị chính xác như bạn cần nó, sử dụng các thành phần mà họ đã có. Ngược lại, REST API giống như một tiệm bánh có những thứ được làm sẵn được đóng gói trong giỏ—bạn chỉ có thể đặt những gì đã được tạo sẵn và bạn không thể chọn chỉ lấy miếng bạn muốn.
- Ít chờ đợi hơn: Vì bạn có thể nhận được tất cả thông tin bạn cần trong một yêu cầu duy nhất, nó giống như yêu cầu máy phục vụ của bạn mang muỗng khai vị, món chính và tráng miệng cùng một lúc, thay vì chờ đợi giữa các khóa học. Hầu hết REST APIs yêu cầu bạn gửi nhiều yêu cầu để lấy các phần thông tin khác nhau.
- Dễ dàng thay đổi đơn hàng: Nếu nhu cầu dữ liệu của ứng dụng của bạn thay đổi, GraphQL giúp bạn dễ dàng điều chỉnh. Bạn chỉ cần thay đổi truy vấn cho những gì bạn cần. Với REST, bạn có thể cần phải chờ đợi nhà bếp (backend) tạo một bữa ăn mới (endpoint) cho thực đơn, điều này mất nhiều thời gian hơn.
GraphQL cung cấp tính linh hoạt, hiệu quả và đơn giản hơn để lấy dữ liệu so với REST APIs, đặc biệt là khi nhu cầu hoặc khả năng của bạn thay đổi hoặc phát triển.
Cách Zonos sử dụng GraphQL
Trong khi hiện đại hóa nền tảng của chúng tôi trong vài năm qua, Zonos đã lựa chọn xây dựng chức năng mới bằng GraphQL cho API của chúng tôi thay vì REST. Chúng tôi quyết định làm điều này vì dữ liệu của chúng tôi phức tạp và tương kết nối, giống như dữ liệu khiến Facebook tạo GraphQL. Sự phức tạp này khiến việc xây dựng các REST APIs có thể mở rộng trở nên khó khăn vì các cách mà các nhà phát triển cần tìm nạp và sử dụng dữ liệu khác nhau rất lớn giữa các triển khai, và REST không linh hoạt.
GraphQL gọn gàng giải quyết vấn đề này bằng cách cho phép các nhà phát triển triển khai API của chúng tôi chọn lựa chính xác dữ liệu nào họ muốn và cách họ lấy nó. Điều này cho phép họ phù hợp với quy trình làm việc của họ mà không cần Zonos phải làm công việc tùy chỉnh (khi họ chờ đợi) cho mọi tình huống.
Kết quả kết hợp của việc sử dụng GraphQL và các hiện đại hóa trong nền tảng của chúng tôi đã làm cho API của chúng tôi hiệu quả hơn, tích hợp Zonos vào các hệ thống của bạn nhanh hơn, và giúp Zonos có thể cung cấp các tính năng mới nhanh chóng hơn.
Các tính năng tốt hơn
Zonos liên tục phát triển các tính năng mới, và GraphQL là tính năng đầu tiên (và thường là duy nhất) để nhận các bản cập nhật này. Ngược lại, các REST APIs của chúng tôi được coi là end-of-life và không thể truy cập nhiều tính năng mới của chúng tôi.
Ví dụ về các tính năng giới hạn cho GraphQL:
- Giá bao gồm
- Labels API
- Checkout mới và Hello
- Kích thước hộp trong phản hồi API
- Báo cáo bảng điều khiển
- Khả năng yêu cầu báo giá DDP nếu có thể, nhưng vẫn trả về báo giá DDU nếu DDP không khả dụng ở quốc gia đó với mức dịch vụ đó
- Phân tích chi tiết về thuế suất, thuế và phí (thông tin cấp độ mục, phí cụ thể)—Bảng điều khiển được cung cấp bởi GraphQL và hiển thị dữ liệu này cho tất cả các cửa hàng, nhưng phản hồi REST API không bao gồm mức độ chi tiết này
- Chế độ thử nghiệm (sắp tới)
Tại sao lại chọn GraphQL
Khám phá tại sao chúng tôi khuyến cáo tích hợp thông qua GraphQL thay vì REST.
Tại Zonos, chúng tôi cung cấp hai loại API chính cho tích hợp: GraphQL và REST. Mặc dù REST APIs đã tồn tại lâu hơn và có thể quen thuộc hơn với nhiều người, chúng tôi đã chuyển sang GraphQL để cho phép tính linh hoạt cao hơn và đổi mới nhanh hơn. Mặc dù cả hai vẫn được hỗ trợ, hướng dẫn này giải thích tại sao GraphQL không chỉ là tương lai của các tích hợp của chúng tôi mà còn là tương lai của các tích hợp nói chung và là công cụ mạnh mẽ hơn để đáp ứng nhu cầu của bạn ngày hôm nay.