스키마 튜토리얼
스키마 튜토리얼레슨 26: 외부 API에서 데이터 필터링하기

레슨 26: 외부 API에서 데이터 필터링하기

외부 API가 필요한 특정 속성으로 필터링을 허용하지 않는 경우, Gato GraphQL을 사용하여 API 응답의 항목들을 반복 처리하고 조건을 충족하지 않는 항목들을 제거할 수 있습니다.

REST API 엔드포인트 newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url을 다시 참조해 보겠습니다. 이 엔드포인트에서는 일부 사용자의 url 속성이 비어 있습니다:

[
  {
    "id": 1,
    "name": "leo",
    "url": "https://leoloso.com"
  },
  {
    "id": 7,
    "name": "Test",
    "url": ""
  },
  {
    "id": 2,
    "name": "Theme Demos",
    "url": ""
  }
]

아래의 GraphQL 쿼리는 url 속성이 비어 있는 사용자를 필터링하여 제외합니다. 처리 절차는 다음과 같습니다:

  • 외부 API에서 데이터를 가져옵니다
  • @underEachArrayItem을 사용하여 항목들을 반복 처리하고, 각 항목을 동적 변수 $userDataEntry에 저장합니다
  • 각 항목에서 url 속성을 추출하고, 해당 값을 동적 변수 $websiteURL에 저장합니다
  • 이 값이 비어 있는지 확인하고, 결과를 동적 변수 $isWebsiteURLEmpty에 할당합니다
  • 조건 디렉티브 @if를 적용하여 $isWebsiteURLEmptytrue인 경우 해당 항목의 값을 null로 설정합니다
  • 디렉티브 @arrayFilter를 실행하여 모든 null 항목들을 제외합니다
query {
  usersWithWebsiteURL: _sendJSONObjectCollectionHTTPRequest(
    input: {
      url: "https://newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url"
    }
  )
    # Remove users without a website URL
    @underEachArrayItem(
      passValueOnwardsAs: "userDataEntry"
      affectDirectivesUnderPos: [1, 2, 3]
    )
      @applyField(
        name: "_objectProperty"
        arguments: {
          object: $userDataEntry
          by: {
            key: "url"
          }
        }
        passOnwardsAs: "websiteURL"
      )
      @applyField(
        name: "_isEmpty"
        arguments: {
          value: $websiteURL
        }
        passOnwardsAs: "isWebsiteURLEmpty"
      )
      @if(
        condition: $isWebsiteURLEmpty
      )
        @setNull
    @arrayFilter
}

응답은 다음과 같습니다:

{
  "data": {
    "usersWithWebsiteURL": [
      {
        "id": 1,
        "name": "leo",
        "url": "https://leoloso.com"
      }
    ]
  }
}