Hàm Queries
Hàm QueriesLoại Bỏ Phản Hồi của Trường

Loại Bỏ Phản Hồi của Trường

Included in the “Power Extensions” bundle

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 SchemaHTTP 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 siteURLrequestURL 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à null
  • IS_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 _objectProperty từ 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: