GraphQL Client beginnend mit Ruby

Was ist das

Was ist GraphQL?

Es ist schwierig auszudrücken, was GraphQL in einem Wort ist, aber ich persönlich erkenne es als "eine Art Protokoll, das API ausdrückt". Oft mit der REST-API verglichen. Mit REST-API

curl http://example.com/users/123/posts/

In GraphQL können Sie es so treffen

curl http://example.com/graphql -X POST --data '
  {
    user("123") {
      posts {
        title
      }
    }
  }
'

Schlagen wie. Die REST-API fordert verschiedene URLs an, z. B. "/ users /" / users / 123 / "/ users / 123 / posts /", um die gewünschten Informationen abzurufen. GraphQL hat jedoch ein Ende. Indem Sie verschiedene Abfragen an die Punkte werfen, können Sie alle erforderlichen Informationen (außer unnötigen Informationen) mit einer Anfrage erhalten.

Erfahren Sie, wie Sie die GraphQL-API verwenden

Ich wünschte, ich hätte in Eile Zugriff auf die GraphQL-API, daher habe ich nur die "Abfragen und Mutationen" und "Schemas und Typen" des offiziellen GraphQL-Handbuchs (https://graphql.org/learn/) gelesen. Ich empfehle es, weil Sie sich einen Überblick verschaffen können, indem Sie zwei etwas längere Seiten lesen.

Es gibt jedoch eine Einschränkung. ** Denken Sie nicht über die Bedeutung der API nach, die als Beispiel angezeigt wird. ** Die folgende Abfrage wird beispielsweise am Anfang angezeigt.

{
  hero {
    name
  }
}

Als Antwort gibt die Beispiel-API diese Antwort zurück:

{
  "data": {
    "hero": {
      "name": "R2-D2"
    }
  }
}

Wenn ich mir dieses Beispiel ansehe, frage ich mich: "Warum geben Sie R2-D2 zurück, obwohl Sie hero_id nicht angegeben haben?" "Wenn Sie hero_id nicht angeben, warum sollten Sie alle Helden zurückgeben?" Infolgedessen behinderte es das Gesamtverständnis. In Wirklichkeit ist diese API nur ein Beispiel, daher sollten Sie ihre Praktikabilität ignorieren und davon ausgehen, dass es sich um so etwas handelt. Es gibt einfach eine "Abfrage namens Held, die eine Episode als optionales Argument verwendet und einen Charakter zurückgibt".

Richten Sie einen GraphQL-Server zum Lernen ein

Apollographql / starwars-server ist eine Reproduktion der mysteriösen Star Wars-API, die im offiziellen GraphQL-Handbuch oben aufgeführt ist. Danach werde ich es verwenden, um von Ruby aus zu treffen, also lasst es uns schnell beginnen. Wenn Sie über Ihren Browser auf http: // localhost: 8080 / graphql zugreifen können, ist der Start erfolgreich.

Es gibt graphql / swapi-graphql mit einem ähnlichen Namen, aber es ist anders, weil es ein GraphQL-Wrapper für die authentischere Star Wars-API ist. Achtung.

Versuchen Sie es mit dem GraphQL-Client in Ruby

Es gibt github / graphql-client als GraphQL-Client von Ruby. Ich war sehr erleichtert, dass Github der Besitzer war, also werde ich dies vorerst verwenden.

Obwohl es in README geschrieben ist, wird es wie folgt verwendet.

require "graphql/client"
require "graphql/client/http"

module SWAPI
  #http Adapter gesetzt
  HTTP = GraphQL::Client::HTTP.new("http://localhost:8080/graphql")

  #Rufen Sie die oben beschriebenen Informationen zum GraphQL-Schema vom API-Server ab
  Schema = GraphQL::Client.load_schema(HTTP)

  #Erstellen Sie einen Client mit den oben genannten
  Client = GraphQL::Client.new(schema: Schema, execute: HTTP)
end

HeroQuery = SWAPI::Client.parse <<~'GRAPHQL'
 {
  hero {
    name
  }
}
GRAPHQL

result = SWAPI::Client.query(HeroQuery)
pp result.to_h

Oben werden die Schemainformationen vom Server abgerufen, aber es scheint auch eine Möglichkeit zu geben, sie vorab lokal zu speichern und wie folgt zu laden.


module SWAPI
  #Stellen Sie den http-Adapter ein (wie oben)
  HTTP = GraphQL::Client::HTTP.new("http://localhost:8080/graphql")

  #Informationen zum GraphQL-Schema aus einer lokalen Datei abrufen
  Schema = GraphQL::Client.load_schema("path/to/schema.json")

  #Erstellen Sie einen Client mit den oben genannten (wie oben)
  Client = GraphQL::Client.new(schema: Schema, execute: HTTP)
end

#Informationen zum GraphQL-Schema vom API-Server abrufen und in die lokale Datei ausgeben
GraphQL::Client.dump_schema(SWAPI::HTTP, "path/to/schema.json")

# ...

wichtiger Punkt

Wenn Sie der Abfrage einen Operationsnamen geben möchten, müssen Sie ihn an das Argument "SWAPI :: Client.query ()" übergeben, als wäre es ein Modulname.

HeroQuery = SWAPI::Client.parse <<~'GRAPHQL'
 #Wenn Sie es NameOfHero nennen ...
 query NameOfHero {
  hero {
    name
  }
}
GRAPHQL

#HeroQuery anstelle von HeroQuery::Sie müssen NameOfHero übergeben!
result = SWAPI::Client.query(HeroQuery::NameOfHero)

Wenn Sie dies vergessen, erhalten Sie den Fehler "erwartete Definition ist eine GraphQL :: Client :: OperationDefinition, war aber GraphQL :: Language :: Nodes :: Document (TypeError)".

Aus diesem Grund können Sie auch nicht unbedingt Namen benennen, die mit Kleinbuchstaben beginnen (Sie erhalten den Fehler client.rb: 241: in'const_set ': falscher konstanter Name ... (NameError)).

Ich bin der Meinung, dass alle Probleme rund um diese ↓ diese Spezifikation einfach übersehen.

Ich war süchtig danach, weil es nicht in der README-Datei angegeben war ... (Beitragschance?)

Recommended Posts

GraphQL Client beginnend mit Ruby
Mutation mit GraphQL
Erste Schritte mit Ruby
Datenkern beginnend mit Gradle
Beginnend mit Swift Swift UI
Evolve Eve mit Ruby
Spielen Sie mit dem Jersey OAuth 2-Client
Wechseln Sie die Ruby-Version mit rbenv
Implementieren Sie GraphQL mit Spring Boot
Ruby: Mail mit Starttls senden
Formatieren Sie Ruby mit VS-Code
Wie man ganze Zahlen mit Rubin überprüft
Spring Boot beginnt mit dem Kopieren
Testen Sie den GraphQL-Resolver mit rspec
Spring Boot beginnend mit Docker
Extrahieren Sie eine Zeichenkette, die mit einem Großbuchstaben (Ruby) in Großbuchstaben beginnt.
[Ruby] Problem mit der if-Anweisung
Studieren bei CodeWar (Rubin) ⑤ proc
Verwenden Sie Ruby mit Google Colab
Erste Schritte mit Ruby-Modulen
[ruby] Eine Methode mit einem Argument aufrufen
Installieren Sie Ruby mit pacman auf MSYS2
[Java EE] Implementieren Sie den Client mit WebSocket
Ruby mit AtCoder 6 lernen [Contest 168 Daher]
Programmieren mit Ruby (unterwegs)
Studieren bei CodeWar (Ruby) ④ case ~ when
Implementieren Sie den gRPC-Client in Ruby
[Ruby] Behandeln Sie Instanzvariablen mit Instanzmethoden
Behandle DatePicker mit Ruby / gtk3 + glade3
Eindrücke von Black Jack-Cli mit Ruby
Ich habe GraphQL mit Spring Boot ausprobiert
Installieren Sie Ruby unter Ubuntu 20.04 mit rbenv
Machen Sie ein Tippspiel mit Ruby