Client GraphQL commençant par Ruby

Qu'est-ce que c'est

Qu'est-ce que GraphQL

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.

Apprenez à utiliser l'API GraphQL

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

Configurer un serveur GraphQL pour l'apprentissage

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.

Essayez d'utiliser le client GraphQL dans Ruby

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

# ...

point important

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

Client GraphQL commençant par Ruby
Mutation avec GraphQL
Premiers pas avec Ruby
Data Nucleus commençant par Gradle
À partir de Swift Swift UI
Evolve Eve avec Ruby
Jouez avec le client Jersey OAuth 2
Changer de version Ruby avec rbenv
Implémenter GraphQL avec Spring Boot
Ruby: envoyer des e-mails avec Starttls
Formater Ruby avec VS Code
Comment vérifier les nombres entiers avec ruby
Spring Boot commençant par copie
Tester le résolveur GraphQL avec rspec
Spring Boot à partir de Docker
Extraire une chaîne de caractères commençant par une majuscule avec une expression régulière (Ruby)
[Ruby] problème avec l'instruction if
Étudier à CodeWar (ruby) ⑤ Proc
Utilisez Ruby avec Google Colab
Premiers pas avec les modules Ruby
[ruby] Appel d'une méthode avec un argument
Installez Ruby sur MSYS2 avec pacman
[Java EE] Implémenter le client avec WebSocket
Apprendre Ruby avec AtCoder 6 [Concours 168 Donc]
Programmation avec ruby (en route)
Étudier à CodeWar (ruby) ④ cas ~ quand
Implémenter le client gRPC dans Ruby
[Ruby] Gérez les variables d'instance avec des méthodes d'instance
Gérer DatePicker avec Ruby / gtk3 + glade3
Impressions de faire Black Jack-cli avec Ruby
J'ai essayé GraphQL avec Spring Boot
Installez ruby sur Ubuntu 20.04 avec rbenv
Faites un jeu de frappe avec ruby