Il est difficile d'exprimer ce qu'est GraphQL en un mot, mais je le reconnais personnellement comme "une sorte de protocole qui exprime l'API". Souvent comparé à l'API REST. Avec l'API REST
curl http://example.com/users/123/posts/
Dans GraphQL, vous pouvez le frapper comme ça
curl http://example.com/graphql -X POST --data '
{
user("123") {
posts {
title
}
}
}
'
Frapper comme. L'API REST envoie des requêtes à diverses URL telles que / users /
/ users / 123 /
/ users / 123 / posts /
pour obtenir les informations souhaitées, mais GraphQL a une extrémité. En lançant diverses requêtes aux points, vous pouvez obtenir toutes les informations nécessaires (à l'exception des informations inutiles) en une seule requête.
J'aurais aimé avoir accès rapidement à l'API GraphQL, donc je n'ai lu que les «Requêtes et mutations» et «Schémas et types» du guide officiel GraphQL (https://graphql.org/learn/). Je le recommande car vous pouvez obtenir un aperçu simplement en lisant deux pages légèrement plus longues.
Cependant, il y a une mise en garde. ** Ne réfléchissez pas à la signification de l'API qui apparaît à titre d'exemple. ** Par exemple, la requête suivante apparaît au début.
{
hero {
name
}
}
En réponse, l'exemple d'API renvoie cette réponse:
{
"data": {
"hero": {
"name": "R2-D2"
}
}
}
Quand je regarde cet exemple, je me demande: "Pourquoi renvoyez-vous R2-D2 même si vous n'avez pas spécifié hero_id?" "Si vous ne spécifiez pas hero_id, pourquoi devriez-vous renvoyer tous les héros?" En conséquence, cela a entravé la compréhension globale. En réalité, cette API n'est qu'un exemple, vous devez donc ignorer son aspect pratique et supposer qu'il s'agit de quelque chose comme ça. Il y a simplement une "Requête appelée héros qui prend un épisode comme argument optionnel et renvoie un caractère".
Apollographql / starwars-server est une reproduction de la mystérieuse API Star Wars qui apparaît dans le guide officiel GraphQL ci-dessus. Après cela, il sera utilisé pour frapper à partir de Ruby, alors commençons rapidement. Si vous pouvez accéder à http: // localhost: 8080 / graphql depuis votre navigateur, le démarrage est réussi.
Il existe graphql / swapi-graphql avec un nom similaire, mais il est différent car il s'agit d'un wrapper GraphQL pour l'API Star Wars plus authentique. Faites attention.
Il existe github / graphql-client en tant que client GraphQL créé par Ruby. J'étais très soulagé que github soit le propriétaire, je vais donc l'utiliser pour le moment.
Bien qu'il soit écrit dans README, il est utilisé comme suit.
require "graphql/client"
require "graphql/client/http"
module SWAPI
#jeu d'adaptateurs http
HTTP = GraphQL::Client::HTTP.new("http://localhost:8080/graphql")
#Obtenez des informations sur le schéma GraphQL à partir du serveur API en utilisant ce qui précède
Schema = GraphQL::Client.load_schema(HTTP)
#Créez un client en utilisant ce qui précède
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
Dans ce qui précède, les informations de schéma sont obtenues à partir du serveur, mais il semble qu'il existe également un moyen de les enregistrer localement à l'avance et de les charger comme suit.
module SWAPI
#Définir l'adaptateur http (comme ci-dessus)
HTTP = GraphQL::Client::HTTP.new("http://localhost:8080/graphql")
#Obtenir des informations sur le schéma GraphQL à partir d'un fichier local
Schema = GraphQL::Client.load_schema("path/to/schema.json")
#Créez un client en utilisant ce qui précède (comme ci-dessus)
Client = GraphQL::Client.new(schema: Schema, execute: HTTP)
end
#Obtenir des informations sur le schéma GraphQL du serveur API et les exporter dans un fichier local
GraphQL::Client.dump_schema(SWAPI::HTTP, "path/to/schema.json")
# ...
Si vous voulez donner à la requête un nom d'opération, vous devez le passer comme nom de module dans l'argument de SWAPI :: Client.query ()
.
HeroQuery = SWAPI::Client.parse <<~'GRAPHQL'
#Si vous le nommez NameOfHero ...
query NameOfHero {
hero {
name
}
}
GRAPHQL
#HeroQuery au lieu de HeroQuery::Vous devez passer NameOfHero!
result = SWAPI::Client.query(HeroQuery::NameOfHero)
Si vous oubliez cela, vous obtiendrez l'erreur ʻune définition attendue pour être un GraphQL :: Client :: OperationDefinition mais était GraphQL :: Language :: Nodes :: Document (TypeError) `.
De plus, à cause de cela, vous ne pouvez pas nécessairement nommer des noms commençant par des lettres minuscules (vous obtiendrez l'erreur client.rb: 241: in'const_set ': mauvais nom de constante ... (NameError)
).
Je pense que tous les problèmes autour de cela ↓ négligent simplement cette spécification.
J'étais accro parce que ce n'était pas spécifié dans le README ... (Chance de contribution?)
Recommended Posts