GraphQL Hva, hvorfor, hvordan Dag Olav Prestegarden BouvetOne Nord, 4. mai 2017
Ikke dette
Eller dette
Men dette
Noen problemer med web-apier i dag GraphQL som løsning Features ved GraphQL Agenda Skjemadefinisjon Spørringer Litt om servere Eksempelkode GraphiQL
I dag Mikrotjenester HTTP + JSON Kanskje noe SOAP / XML?
Facebooks kjente slagord Move fast... Kilde: Mashable.com http://mashable.com/2014/04/30/facebooks-new-mantra-move-fast-with-stability/#qr5uj19awpq7
Problemet Casen hos Facebook Mange versjoner å holde orden på Klienter med begrenset databruk Tregt nett
Begrensende klienter Mer og mer mobiltrafikk Begrensning av båndbredde
HTTP/1.X Overhead ved request/response Typisk for REST-APIer - Get bruker for å hente ID Get venner av bruker vha. ID Get posts fra bruker vha. ID Get likes fra posts vha. post-id osv.
Kjent problem for mange her Mange versjoner å holde orden på Mange klienter: Web, Android, ios, Windows Phone mm. Varierende grad av oppdateringer. Ny funksjonalitet, versjonering av API
Vanskelig å sy sammen data GET /kommuner FOR kommune IN {kommuner { GET /kommuner/{kommune.id/uttak FOR uttak IN {uttak { FOR år IN (2015, 2016, 2017) { GET /uttak/rapport/{år GET /tiltakshaver/{rapport.levertav
Alternativet? GET /rapporter/getsisteaargruppertpåkommunemedtiltakshaver Nytt krav: Alle i Sør-Trøndelag fylke men uten tiltakshaver fordi det skal offentliggjøres.
GraphQL
GraphQL Laget av Facebook 2012 - Startet og tatt i bruk i Facebook 2015 - Lansert offentlig
GraphQL Spørrespråk for APIer Typebeskrivelser Referanseimplementasjon Tooling
Features Få det du vil - klienten bestemmer selv format på returnert data Hent mange ting i hver request - server kan parallellisere og bruke sin state til å produsere data mer effektivt Beskriv mulighetene - typesystemet og skjemadefinisjoner gjør det mulig å gjøre oppslag i mulige spørringer og lage god tooling Muliggjør endring i datamodeller - man kan legge til nye felter uten å påvirke eksisterende klienter, og felter kan markers som deprecated for å skjule dem i verktøy og hindre nye konsumenter
Hvordan funker det?
Database Klienter Database GraphQL-server kode() JSON-response API
Schemas, Queries, Resolvers
Schema
Schema schema { query: Query mutation: Mutation
Schema - enkel syntaks type Query { me: Person people: [Person] winners (year: Int) winners (year: Int = 2017) user (id: ID!) type Person { name: String! type: PersonType enum PersonType { EMPLOYEE FREELANCER OTHER
Schema - basistyper type Person { id: ID name: String! age: Int ownscar: Boolean mileageperyear: Float type: MyEnum friends: [Person]! enemies: [Person!] enum MyEnum { SOMETHING ORTHEOTHER
Schema - mer Interfaces Union Types Input types
Schema - Validering Basert på typedefinisjonene Gode feilmeldinger som følge av disse
Queries
Queries - Hello World { { hello "hello": "Hello world!"
Queries - Nøstede { { hello { singular, plural "hello": { "singular": "Hello you!", "plural": "Hello everyone!"
Queries - Parametre { { hello(name: "Bouvet") "hello": "Hello Bouvet!"
Queries Videre Mutations Fragments Variabler og substitusjon typename
Schema type Query { me: Person, people( search: String, limit: Int, skip: Int): [Person] type Person { name: String, age: Int, posts: [Post], address: String Spørring { me { name Svar { "data": { "me": { "name": "Dag Olav Prestegarden"
Kjøring på serveren
Kjøring På en server Root field schema { query: Query mutation: Mutation Resolvers
Introspeksjon
Introspeksjon Kommer som følge av schema-definisjon og er en del av speccen. Tillater spørringer som f.eks. { schema {types { kind name description
GraphiQL
GraphiQL Enkel web-app som fungerer som et utforskende IDE mot GraphQL-endepunkter Innebygget i flere av rammeverkene, ellers lett å hoste ved siden av et endepunkt Gir oversikt over typer, autocompletion ved bygging av spørringer osv.
Demo Sunn og Frisk til jobben
Hvem bruker dette? og en rekke andre: http://graphql.org/users/
Hvor begynner man? Både klient- og serverimplementasjoner for en rekke språk og rammeverk Se http://graphql.org/code/ ( Spesiell merknad til PostgraphQL ) Mange tutorials og etterhvert en god del konferansevideoer o.l. på YouTube Sjekk også ut https://github.com/chentsulin/awesome-graphql
Flere ting å tenke på Servering Sikkerhet Caching Pagination Osv.
Servering Et endepunnkt, typisk /graphql GET (queries) + POST (mutations)
Autentisering Bruk GraphQL etter all autentiseringsmiddleware o.l. i stacken din. Injiser brukerinfo/claims o.l. i context som brukes av resolvers Videresend ev. nødvendig brukerinfo til backend-tjenester og business-logikk Typisk ikke 401 o.l. siden man kan ha tilgang til deler av grafen man ber etter. Ofte kan man derfor få en graf som mangler deler man ikke har tilgang til
Slicing Paginering Cursor based blir ofte brukt, og man ser derfor ofte begrepene edges, node og cursor i resultater som bruker denne typen systemer.
Ikke så enkelt å implementere automatisk browser-caching Caching Støtter enkelt caching av delobjekter på server-side for hver enkelt resolver Eksponere unik identifier for objekter til klienter for mer manuell caching i klient
Alternativer
Spørsmål? Takk for meg