Schema-Tutorial
Schema-TutorialLektion 26: Daten aus einer externen API filtern

Lektion 26: Daten aus einer externen API filtern

Wenn die externe API kein Filtern nach einer bestimmten Eigenschaft erlaubt, die wir benötigen, können wir Gato GraphQL verwenden, um die Einträge in der API-Antwort zu durchlaufen und diejenigen zu entfernen, die unsere Bedingung nicht erfüllen.

Schauen wir uns erneut den REST API-Endpunkt newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url an, bei dem einige Benutzer die Eigenschaft url leer haben:

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

Die folgende GraphQL-Query filtert die Benutzer heraus, bei denen die Eigenschaft url leer ist, indem sie:

  • Daten von der externen API abruft
  • Die Einträge über @underEachArrayItem durchläuft und jeden Eintrag in der dynamischen Variable $userDataEntry ablegt
  • Die Eigenschaft url aus jedem Eintrag extrahiert und diesen Wert in der dynamischen Variable $websiteURL ablegt
  • Prüft, ob dieser Wert leer ist, und das Ergebnis der dynamischen Variable $isWebsiteURLEmpty zuweist
  • Die bedingte Direktive @if anwendet, die den Wert dieses Eintrags auf null setzt, wenn $isWebsiteURLEmpty true ist
  • Die Direktive @arrayFilter ausführt, um alle null-Einträge herauszufiltern
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
}

Die Antwort lautet:

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