Công cụ GraphQL API
Format GraphQL, kiểm tra query theo schema (SDL hoặc introspection), đo độ sâu và độ phức tạp, so sánh schema tìm thay đổi phá vỡ, SDL ↔ JSON.
Bộ công cụ dựa trên graphql-js 17, bản triển khai chuẩn của GraphQL. action=format định dạng lại query hoặc tài liệu SDL. validate kiểm tra query theo schema (văn bản SDL hoặc kết quả introspection), trả về mọi lỗi kèm dòng và cột, cùng danh sách trường được dùng (dạng Type.field) và trường nào đã bị deprecated. Lỗi cú pháp luôn có vị trí. analyze liệt kê các operation, biến, fragment, và cho mỗi operation: độ sâu, số trường, số alias và điểm phức tạp có tính danh sách (số trường nhân với đối số first / last / limit); max_depth và max_complexity biến nó thành phép kiểm tra đạt / không đạt cho gateway.
stats tóm tắt schema: số kiểu theo loại, số trường, các query, mutation, subscription kèm đối số, directive tự định nghĩa và trường deprecated. diff so sánh old_schema với new_schema và phân loại thay đổi thành phá vỡ (xoá trường, đối số thành bắt buộc…), nguy hiểm (thêm đối số tuỳ chọn, thêm giá trị enum…) và an toàn. to-sdl chuyển JSON introspection sang SDL (sort=true để sắp xếp kiểu và trường), to-introspection làm ngược lại, còn sample sinh query mẫu cho một trường của Query hoặc fragment cho một kiểu.
Giới hạn: 2 MB mỗi tài liệu, 200.000 token. API không thực thi gì: query của bạn không bao giờ được gửi tới máy chủ nào.
Tham số
| Tên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
action | body|query | string | không | format, validate, analyze, stats, diff, to-sdl, to-introspection, sample (tự đoán theo dữ liệu gửi lên nếu bỏ trống). | |
query | body|query | string | không | Query / mutation / fragment GraphQL, hoặc SDL khi format. | |
schema | body | string | không | Schema dạng văn bản SDL hoặc JSON introspection. | |
old_schema | body | string | không | So sánh: schema cũ. | |
new_schema | body | string | không | So sánh: schema mới. | |
max_depth | body|query | number | không | Analyze / validate: độ sâu tối đa cho phép (thêm depth_ok). | |
max_complexity | body|query | number | không | Analyze / validate: độ phức tạp tối đa (thêm complexity_ok). | |
type | body|query | string | không | Sample: tên trường của Query hoặc tên kiểu. | |
depth | body|query | number | không | 2 | Sample: độ sâu lồng nhau (1–5). |
sort | body|query | boolean | không | false | to-sdl: sắp xếp kiểu và trường theo bảng chữ cái. |
Ví dụ
curl -X POST "https://apibox.io.vn/v1/graphql-tools" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"schema":"type Book {\n id: ID!\n title: String\n isbn: String @deprecated(reason: \"use id\")\n}\n\ntype Query {\n book(id: ID!): Book\n}","query":"{ book(id: 1) { title isbn price } }"}'const res = await fetch('https://apibox.io.vn/v1/graphql-tools', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"schema": "type Book {\n id: ID!\n title: String\n isbn: String @deprecated(reason: \"use id\")\n}\n\ntype Query {\n book(id: ID!): Book\n}",
"query": "{ book(id: 1) { title isbn price } }"
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/graphql-tools",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"schema": "type Book {\n id: ID!\n title: String\n isbn: String @deprecated(reason: \"use id\")\n}\n\ntype Query {\n book(id: ID!): Book\n}", "query": "{ book(id: 1) { title isbn price } }"},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/graphql-tools');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"schema":"type Book {\\n id: ID!\\n title: String\\n isbn: String @deprecated(reason: \\"use id\\")\\n}\\n\\ntype Query {\\n book(id: ID!): Book\\n}","query":"{ book(id: 1) { title isbn price } }"}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Kết quả trả về
{
"valid": false,
"errors": [
{
"message": "Cannot query field \"price\" on type \"Book\".",
"locations": [
{
"line": 1,
"column": 28
}
]
}
],
"operations": [
{
"name": null,
"type": "query",
"variables": [],
"depth": 2,
"field_count": 4,
"complexity": 4,
"aliases": 0,
"root_fields": [
"book"
]
}
],
"fragments": [],
"fields_used": [
{
"coordinate": "Query.book",
"type": "Book",
"deprecated": null,
"count": 1
},
{
"coordinate": "Book.title",
"type": "String",
"deprecated": null,
"count": 1
},
{
"coordinate": "Book.isbn",
"type": "String",
"deprecated": "use id",
"count": 1
}
],
"deprecated_used": [
"Book.isbn"
]
}
Ứng dụng
- Cho CI báo lỗi khi thay đổi schema làm hỏng client đang dùng
- Chặn query quá sâu hoặc quá tốn tài nguyên ở API gateway
- Chuyển schema tải về bằng introspection thành SDL dễ đọc
- Tìm các trường deprecated mà query của client vẫn còn dùng
Hỏi đáp
API có chạy query của tôi không?
Không. API chỉ phân tích và kiểm tra tài liệu theo schema bạn gửi, không gửi request nào tới máy chủ GraphQL của bạn.
Độ phức tạp được tính thế nào?
Mỗi trường được chọn tính 1, nhân với giá trị số nguyên của các đối số first, last, limit, take, pageSize hoặc top ở các trường cha. Fragment được mở rộng một lần và vòng lặp bị cắt.
Có thể gửi schema dạng JSON introspection không?
Có, với mọi thao tác: truyền kết quả JSON của truy vấn introspection (có __schema hoặc data.__schema) thay cho SDL.
API liên quan
Tạo UUID
Sinh tối đa 1.000 UUID v4, UUID v7 theo thời gian, ULID, Nano ID hoặc mã hex ngẫu nhiên mỗi request. Ngẫu nhiên an toàn, hỗ trợ chữ in hoa.
⏱Phân tích biểu thức cron
Kiểm tra biểu thức cron và xem các lần chạy tiếp theo theo múi giờ bất kỳ, kèm mô tả dễ hiểu. Hỗ trợ cú pháp cron 5, 6 và 7 trường.
🕒Giờ & múi giờ
Lấy giờ hiện tại ở mọi múi giờ, đổi giữa các múi giờ và Unix timestamp (giây hoặc mili giây), kèm độ lệch UTC và thứ trong tuần cho tối đa 30 múi giờ.