CODE SNACK @OK
Query API via
GraphQL
Lars Röwekamp
CIO New Technologies
@mobileLarson
@_openknowledge
#WISSENTEILEN
Living in a
RESTful World
Komplexe Abfragen mit REST
#WISSENTEILEN
// Bestellungen: Bestellungen vom Typ Bücher
vom Autor T.C. Boyle
zum Preis günstiger als 10.00 €
GET /orders?type=book&author=Boyle&price<10.00
Komplexe Abfragen mit REST
btw: UND oder ODER oder UND/ODER?
#WISSENTEILEN
// Bestellungen: Bestellungen vom Typ Bücher
UND vom Autor T.C. Boyle
ODER zum Preis günstiger als 10.00 €
GET /orders?type=book;author=Boyle,price<9.99
Komplexe Abfragen mit REST
btw: Klammerung
#WISSENTEILEN
// Bestellungen: Bestellungen vom Typ ...
// RQL query ... (must possibly be encoded!)
GET /orders?query=
and(eq(type,books),
or(eq(author,Boyle),lt(price,10.00))
// RQL alternative query – FIQL (URI friendly) - ...
GET /orders?query=
type==book;(author==Boyle,price=lt=10.00)
Komplexe Abfragen mit RQL*
*https://github.com/persvr/rql
#WISSENTEILEN
Resource Query Language
• Object-Style Query Language
• FIQL Superset (erweiterbar)
• Spezifikation & JS Parser (Client & Server)
• JS Array, SQL, MongoDB, Elastic Search
• Java Parser + JPA Criteria Builder
Komplexe Abfragen mit RQL*
*https://github.com/persvr/rql
#WISSENTEILEN
Wirklich komplexe Abfragen mit REST
#WISSENTEILEN
Wer genau ist eigentlich dieser „Luke“?
GET /people/1
Wirklich komplexe Abfragen mit REST
#WISSENTEILEN
Wer genau ist eigentlich dieser „Luke“ und in welchen Filmen
hat er mitgespielt?
GET /people/1/films (falls es der Endpoint anbietet)
GET /films/1
GET /films/2
GET /films/3
Wirklich komplexe Abfragen mit REST
#WISSENTEILEN
Wer genau ist eigentlich dieser „Luke“ und in welchen Filmen
hat er mitgespielt und auf welchen Raumschiffen ist er darin „gefahren“?
GET /people/1/starships (falls es der Endpoint anbietet)
GET /starships/12
GET /starships/22
Wirklich komplexe Abfragen mit REST
#WISSENTEILEN
Wie alt ist Luke und welche Haarfarbe hat er?
Mit welchem Spruch wurden die Filme eröffnet, in denen er mitgespielt hat?
Und wie teuer waren überhaupt die Raumschiffe auf denen er gefahren ist?
GET /?F#CKING/detail (n+1 problem)
GET /?F#CKING/all (job problem)
Wirklich komplexe Abfragen mit REST
#WISSENTEILEN
Umdenken, du musst!
#WISSENTEILEN
Motivation:
„ We see a conflict between the desire to load all
information in a single round trip while keeping REST
resources well isolated.”
Komplexe Abfragen: „Umdenken du musst!“
(Facebook, 2012)
#WISSENTEILEN
Motivation:
Komplexe Abfragen: „Umdenken du musst!“
(Facebook, 2012)
#WISSENTEILEN
GraphQL Idee:
• Beliebige Abfragen via Objekt-Graph
auf dem ich navigieren kann.
• Lieferung des Abfrage-Results in einem
einzigen Round-Trip.
Komplexe Abfragen: „Umdenken du musst!“
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
Was zeichnet GraphQL aus?
• hierarchicial
• product centric
• strongly typed & instrospective
• client specific queries
• application-layer protokol
GraphQL Charakteristika
#WISSENTEILEN
Fragen, was du willst,
du musst!
#WISSENTEILEN
#WISSENTEILEN
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
Woher weiß das Backend was ich will?
• API Schema als gemeinsame Basis
• Query als Anfrage vom Client
• Step 1: parse (Query into an abstract syntax tree)*
• Step 2: validate (against Schema)**
• Step 3: execute (Resolve Functions)
GraphQL und das Backend
(*syntaktisch korrekt , **semantisch korrekt)
#WISSENTEILEN
// A very simple GraphQL schema example
type Character {
name: String! // non nullable
appearsIn: [Episode]! // array of ..., non nullable
}
type Starship {
id: ID! // unique ID
name: String!
length(unit: LengthUnit = METER): Float // parameter
}
GraphQL und das Backend
#WISSENTEILEN
GraphQL
vs.
REST Aggregation?
Aggregation?
Aggregation?
#WISSENTEILEN
GraphQL
vs.
REST
Aggregation!
#WISSENTEILEN
Der GraphQL Server
• Query Parser
• Data Fetcher
• Data Aggregator
• Chaching von Result-Graphs
• Aktualisierung von Result-Graphs
GraphQL und das Backend
#WISSENTEILEN
Muss ich das alles selber bauen?
• Nein! Es gibt ...
• Clients, Server, DB, Libraries, Tools ...
für Java, JavaScript, Python, Ruby, PHP, C/C++, GO, Scala, .Net,
SQL, ...
> http://graphql.org
> https://github.com/chentsulin/awesome-graphql
GraphQL und das Backend
#WISSENTEILEN
Cool, ist das wirklich alles so einfach?
• relative neue Technologie (im Fluss)
• Chaching?
• Dupletten?
• Information Hiding?
• Versionierung? (vs. deprecated)
GraphQL und Ich
? ? ?
FRAGEN
#WISSENTEILEN
Kontakt
LARS RÖWEKAMP
CIO NEW TECHNOLOGIES
lars.roewekamp@openknowledge.de
+49 (0)441 4082 – 101
@mobileLarson
@_openknowledge
OFFENKUNDIGGUT
#WISSENTEILEN
Bildnachweise
#02: © skynesher – istockphoto.com
#12: © jpgfactory – istockphoto.com
All other pictures inside this presentation orginate from
pixabay.com.
#WISSENTEILEN

Query API via GraphQL