Loại Bỏ Phản Hồi của Trường
Bổ sung chỉ thị @remove vào schema GraphQL, giúp loại bỏ đầu ra của một trường khỏi phản hồi.
Mô tả
Đặc tả GraphQL chỉ ra rằng phản hồi GraphQL phải khớp chính xác với hình dạng của query. Tuy nhiên, trong một số trường hợp, chúng ta muốn tránh gửi lại phản hồi của trường, vì:
- Chúng ta đã biết giá trị đó là gì, và bằng cách không gửi lại, chúng ta có thể tăng hiệu suất
- Nó chứa thông tin nhạy cảm (chẳng hạn như thông tin đăng nhập)
- Một trường rỗng có thể được phân biệt với giá trị
null
Bằng cách thêm @remove vào trường, trường đó sẽ không được in ra trong phản hồi.
Trong query dưới đây (sử dụng các extension PHP Functions via Schema và HTTP Client), chúng ta tạo URL để gửi một yêu cầu HTTP, bằng cách nối tên miền của site và endpoint của REST API. Vì giá trị của các "thành phần" này không cần thiết với chúng ta, không cần phải in chúng ra trong phản hồi, và chúng ta có thể dùng @remove để loại bỏ chúng:
query {
siteURL: optionValue(name: "siteurl")
@remove
requestURL: _sprintf(
string: "%s/wp-json/wp/v2/comments/11/?_fields=id,content,date",
values: [$__siteURL]
)
@remove
_sendJSONObjectItemHTTPRequest(
input: {
url: $__requestURL
}
)
}...tạo ra kết quả (lưu ý rằng các trường siteURL và requestURL không có trong phản hồi):
{
"data": {
"_sendJSONObjectItemHTTPRequest": {
"id": 11,
"date": "2020-12-12T04:07:36",
"content": {
"rendered": "<p>Btw, I really like this stuff<\/p>\n"
}
}
}
}Chúng ta cũng có thể yêu cầu chỉ thị @remove loại bỏ giá trị có điều kiện, khi một điều kiện được thỏa mãn. Tham số condition có thể nhận 3 giá trị:
ALWAYS(giá trị mặc định): Luôn luôn loại bỏIS_NULL: Loại bỏ khi giá trị lànullIS_EMPTY: Loại bỏ khi giá trị rỗng
Ví dụ, trong query dưới đây, khi một bài viết không có ảnh đại diện, trường featuredImage sẽ có giá trị null. Bằng cách thêm @remove(condition: IS_NULL), giá trị này sẽ không được thêm vào phản hồi:
query {
posts {
title
featuredImage @remove(condition: IS_NULL) {
src
}
}
}...tạo ra kết quả:
{
"data": {
"posts": [
{
"title": "Hello world!"
},
{
"title": "Nested mutations are a must have",
"featuredImage": {
"src": "https:\/\/gato-graphql.lndo.site\/wp-content\/uploads\/2022\/05\/graphql-voyager-public.jpg"
}
},
{
"title": "Customize the schema for each client"
}
]
}
}Ví dụ
Loại bỏ dữ liệu không cần thiết từ một API bên ngoài
Giả sử chúng ta muốn lấy một số dữ liệu cụ thể từ một endpoint REST API bên ngoài và không cần phần còn lại của dữ liệu. Chúng ta có thể dùng @remove để làm cho payload phản hồi nhỏ hơn, từ đó tăng hiệu suất:
- Sử dụng trường
_sendJSONObjectItemHTTPRequest(từ extension HTTP Client) để kết nối với REST API - Xử lý dữ liệu này để trích xuất thông tin cần thiết (thông qua Field to Input và trường
_objectPropertytừ PHP Function via Schema) - Dùng
@removeđể loại bỏ dữ liệu gốc từ endpoint REST
Query này kết hợp tất cả lại với nhau:
{
postData: _sendJSONObjectItemHTTPRequest(input: {
url: "https://newapi.getpop.org/wp-json/wp/v2/posts/1"
}) @remove
renderedTitle: _objectProperty(
object: $__postData,
by: {
path: "title.rendered"
}
)
}Trong phản hồi của query này, trường postData đã bị loại bỏ:
{
"data": {
"renderedTitle": "Hello world!"
}
}Tránh in thông tin đăng nhập của người dùng
Ví dụ này kết nối với GitHub API để lấy các artifact có trong một repository riêng tư, và tránh in thông tin đăng nhập của người dùng ra trong phản hồi:
query RetrieveGitHubActionArtifacts(
$repoOwner: String!
$repoProject: String!
) {
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
@remove
# Create the authorization header to send to GitHub
authorizationHeader: _sprintf(
string: "Bearer %s"
# "Field to Input" feature to access value from the field above
values: [$__githubAccessToken]
)
@remove
# Create the authorization header to send to GitHub
githubRequestHeaders: _echo(
value: [
{ name: "Accept", value: "application/vnd.github+json" }
{ name: "Authorization", value: $__authorizationHeader }
]
)
@remove
githubAPIEndpoint: _sprintf(
string: "https://api.github.com/repos/%s/%s/actions/artifacts"
values: [$repoOwner, $repoProject]
)
# Use the field from "Send HTTP Request Fields" to connect to GitHub
gitHubArtifactData: _sendJSONObjectItemHTTPRequest(
input: {
url: $__githubAPIEndpoint
options: { headers: $__githubRequestHeaders }
}
)
}Đặc tả GraphQL
Chức năng này hiện chưa là một phần của đặc tả GraphQL, nhưng đã được đề xuất: