Schema-tutorial
Schema-tutorialLes 26: Gegevens filteren van een externe API

Les 26: Gegevens filteren van een externe API

Als de externe API geen filtering toestaat op een bepaalde eigenschap die we nodig hebben, kunnen we Gato GraphQL gebruiken om over de vermeldingen in de API-respons te itereren en die te verwijderen die niet aan onze voorwaarde voldoen.

Laten we opnieuw verwijzen naar het REST API-endpoint newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url, waarbij sommige gebruikers een lege eigenschap url hebben:

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

De onderstaande GraphQL-query filtert de gebruikers waarbij de eigenschap url leeg is, door:

  • Gegevens op te halen van de externe API
  • Over de vermeldingen te itereren via @underEachArrayItem, en elke vermelding onder de dynamische variabele $userDataEntry te plaatsen
  • Eigenschap url uit elke vermelding te extraheren en deze waarde onder de dynamische variabele $websiteURL te plaatsen
  • Te controleren of deze waarde leeg is, en het resultaat toe te wijzen aan de dynamische variabele $isWebsiteURLEmpty
  • De conditionele directive @if toe te passen die, als $isWebsiteURLEmpty true is, de waarde van die vermelding op null zet
  • Directive @arrayFilter uit te voeren om alle null-vermeldingen te filteren
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
}

De respons is:

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