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.
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".
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.
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")
# ...
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