Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GraphQL

 GraphQL

Heraud Kevin

May 31, 2018
Tweet

More Decks by Heraud Kevin

Other Decks in Programming

Transcript

  1. Social beer • Recherche (bières) • Détail d’une bière •

    Détail d’une brasserie • Gestion des « beerer » • « check in » • Evaluation • …
  2. GraphQL ? GraphQL = Langage de requête + « runtime

    » serveur (Chez Facebook depuis 6 ans, « open sourcé » depuis 3) {En bref} • Permet au client de préciser les données dont il a besoin • Utilise un système de types • Facilite l'agrégation des données
  3. GraphQL ? • Schema : Contrat entre le « frontend

    » et le « backend » • Type : Données de sortie • Input : Données d’entrée • Scalar : Int, Float, String, Boolean et ID • Query : Opérations de lecture • Mutation : Opérations d’écriture • Resolvers : Fonction permettant de trouver la valeur scalaire d’un champ
  4. type Beer { beerID: ID!, beerName: String, description: String, abv:

    Float, picture: String, rating: Rating brewery: Brewery, category: Category, style: Style } type Query { findBeer(filter: FilterInput): [Beer] } type Mutation { rate(input: RateInput): Boolean }
  5. Exécution d’une requête 1. Parse 2. Validate 3. Execute Transformation

    de la requête en AST (abstract syntax tree) Une requête peut être syntaxiquement correcte, mais n’avoir aucun sens (validation en fonction du schéma) Lorsqu'un jour exalté l'aède prosaïse D'aucuns par dessus tout prisent les escargots Le Turc de ce temps-là pataugeait dans sa crise Et fermentent de même et les cuirs et les peaux https://fr.wikipedia.org/wiki/Cent_mille_milliards_de_po%C3%A8mes {findBeer(filter:{id:1}){beerName picture rating{avg}}} Exécution de la requête
  6. QUERY {findBeer(filter:{id:1}){beerName picture rating{avg}}} BEER RATING { beerID, beerName, picture,

    … } beerName picture rating { avg, rating } avg Flow d’exécution https://www.apollographql.com/docs/graphql-tools/remote-schemas.html
  7. obj args context Objet précédent (absent dans le cas d’un

    « resolver » racine) Arguments passés dans la requête Contexte partagé par tous les « resolvers » Implémentation d’un « resolver »
  8. Directive (@skip, @include, @deprecated) Fragment (…commonsFields) Introspection (__Schema, __Type, __TypeKind,

    __Field) Subscriptions Allons plus loin https://www.apollographql.com/docs/graphql-tools/
  9. HTTP POST /graphql findBeerer(filter: {id: 3}) { beererName picture description

    } "data": { "findBeerer": [ { "beererName": "Jacques Chirac", "picture": "https://foo.fr/guignols-de-l-info.jpg", "description": "Mangez des pommes !" } ] }
  10. Verbe PUT, POST, PATCH POST (ou GET) Gestion des versions

    • « URI path or parameter » • « Accept Header » Version free (add-only + @deprecated) Réponses partielles • fields=beerName,abv • include=brewery • embed=brewery.city Pris en compte nativement Codes de réponse 200, 201, 204, 206, 400, 401, 401, 404, … 200, 400 Gestion dans les objets de de retour Pagination offset=20&limit=10 Content-Range: 0-47/48 Accept-Range: beer 50 “Cursor-based pagination is the most efficient method” -- Facebook Documentation Swagger, RAML, OpenAPI Introspection du schéma
  11. • Conçu par des développeurs Android pour des développeurs Android

    • Génération d’objets • Validation des « query » à la compilation
  12. Apollo dans Android Plugin Gradle (build.gradle) dependencies { classpath 'com.apollographql.apollo:apollo-gradle-plugin:0.4.4'

    } Runtime (app/build.gradle) apply plugin: 'com.apollographql.android‘ … dependencies { … implementation 'com.apollographql.apollo:apollo-runtime:0.4.4' }
  13. Schema Un fichier « schema.json » généré par le serveur

    doit être présent dans l’arborescence du projet. apollo-codegen download-schema http://localhost:8080/graphql --output schema.json