Web APIs
Jenseits von REST & Request/Response
Lars Röwekamp
CIO New Technologies
@mobileLarson
@_openknowledge
#WISSENTEILEN
Branchenneutrale Softwareentwicklung und IT-Beratung
ÜBER OPEN KNOWLEDGE
#WISSENTEILEN
Lars Röwekamp (a.k.a. @mobileLarson)
ÜBER MICH
LR
#WISSENTEILEN
Wer bin ich - und wen ja, wie viele?
• CIO New Technologies
• Enterprise & Mobile
• Author, Speaker, Coach & Mentor
• Snowboard & MTB Enthusiast
• mehrfacher Vater, einfacher Ehemann
Das kleine
REST 1x1
Das kleine REST 1x1
#WISSENTEILEN
REpresentational State Transfer is about ...
• Architectural Design Style
• Client-Server
• Stateless
• Cache
• Uniform Interface
• Layered System
Das kleine REST 1x1
#WISSENTEILEN
REpresentational State Transfer
• Identifikation durch URL
• Manipulation durch Representation
• Selbstbeschreibende Messages
• Hypermedia
/orders/123JSON/XML
GET, POST, PUT, DELETE
Media Types, Headers, ...References
Das kleine REST 1x1
#WISSENTEILEN
...	/orders/ ... /orders/123
Liste	aller	Bestellungen einzelne Bestellung	123
erzeuge	neuen Bestellung ERROR
ändere	„Liste“	von	
Bestellung
ändere	Bestellung 123	sonst	ERROR
lösche	alle	Bestellungen lösche	Bestellung 123
Nomen
GET
POST
PUT
DELETE
Single Item URIList URI
Plural
Das kleine REST 1x1
#WISSENTEILEN
Golden rules of REST
• „We only need two URLs“
• „Verbs are bad, nouns are good“
• „Plurals are even better“
• „The web is your friend“
• „There is always a root (associations)“
• „There is always a parameter (complex stuff)“
Das kleine REST 1x1
#WISSENTEILEN
„There is always a root“
• GET /orders/123/ingredients
• GET /orders/123/ingredients/456
• GET /orders/123/ingredients/milk
• PUT /orders/123/ingredients/milk
• POST /orders/123/ingredients/milk
• DELETE /orders/123/ingredients/milk
Das kleine REST 1x1
#WISSENTEILEN
„There is always a parameter“
• Path für Ressource Identifier
• Query für Abfrageparameter, Filter, etc.
• Body für Ressource-spezifische Logik
• Header für globale, plattformweite Parameter
#WISSENTEILEN
Das kleine REST 1x1
#WISSENTEILEN
Headers? Pro Tipp: Use them!
• Version-Header
• Location-Header
• Accept-Header
• Content-Type
• Link-Header
• X-Custom-Header (Override Method, Limit, ...)
Das kleine REST 1x1
#WISSENTEILEN
Status Codes? Pro Tipp: Use them!
• 1xx: Hold on ...
• 2xx: Here you go!
• 3xx: Go away!
• 4xx: You f#!?ed up!
• 5xx: I f#!?ed up!
Das kleine REST 1x1
#WISSENTEILEN
Status Codes? Pro Tipp: Use them!
• 1xx: Hold on ...
• 2xx: Here you go!
• 3xx: Go away!
• 4xx: You f#!?ed up!
• 5xx: I f#!?ed up!
(http://restlet.com/http-status-codes-map)
Das kleine REST 1x1
#WISSENTEILEN
HATEOAS? Pro Tipp: ... WAIT!
• What the heck is Hateoas?
REST & Evolution
#WISSENTEILEN
REST & Hateoas
„If the engine of application state (and
hence the API) is not driven by hypertext,
then it cannot be RESTful and cannot be a
REST API.“
Roy	Fielding
#WISSENTEILEN
#WISSENTEILEN
REST & Hateoas
„A REST API should be entered with no
prior knowledge beyond the initial URI ...
From that point on, all application state
transitions must be driven by the client
selection of server-provides choices ...“
Roy	Fielding
#WISSENTEILEN
REST & Hateoas
Entrypoint:
/orders
#WISSENTEILEN
REST & Hateoas
// Response with link header for HYPERMEDIA navigation
// after calling „POST .../orders/ <order ... />“
HTTP/1.1. 201 Created
[various other headers]
Link: <.../orders/1234>; rel=„cancel“
<.../orders/1234>; rel=„update“,
<.../orders/1234>; rel=„delete“,
<.../payment/1234>; rel=„pay“
#WISSENTEILEN
REST & Hateoas
// Response with link header for HYPERMEDIA navigation
// after calling „GET .../orders?page=10“
HTTP/1.1. 206 Partial Content
[various other headers]
Link: <.../orders?page=1>; rel=„first“
<.../orders?page=9>; rel=„next“,
<.../orders?page=11>; rel=„prev“,
<.../orders?page=17>; rel=„last“
#WISSENTEILEN
demo$ rest 1x1
demo$ |
#WISSENTEILEN
REST & Hateoas
// Response with link header for HYPERMEDIA navigation
// after calling „GET .../orders?page=10“
HTTP/1.1. 206 Partial Content
[various other headers]
Link: <.../orders?page=1>; rel=„first“
<.../orders?page=9>; rel=„next“,
<.../orders?page=11>; rel=„prev“,
<.../orders?page=17>; rel=„last“
Wait, does this
make sense?
REST & Pagination
REST & Pagination
#WISSENTEILEN
Wie navigiere ich durch Ressourcen?
• Path Parameter?
• Query Parameter?
• Client Side Calculation?
• Server Side Calculation?
#WISSENTEILEN
REST & Pagination
// List page 4 of offers
// Is page a query parameter?
GET /offers?page=4 HTTP/1.1
// Or is page a „virtual“ resource?
GET /offers/page/4 HTTP/1.1
BTW: what does
„page 4“ mean?
#WISSENTEILEN
REST & Pagination
// List next 5 offers starting from offer 10
// Or is page x a result of offset and limit?
GET /offers?offset=10&limit=5 HTTP/1.1
// Response with success code and link header for
// navigation purpose
HTTP/1.1. 206 Partial content
Link: <.../orders?offset=0&limit=5>; rel=„first“
<.../orders?offset=5&limit=5>; rel=„prev“,
<.../orders?offset=15&limit=5>; rel=„next“,
<.../orders?offset=40&limit=2>; rel=„last“
BTW: What‘s about
filtering, sorting, ....
REST & Queries
REST & Queries
#WISSENTEILEN
Was ist eigentlich mit ...
• komplex(er)en Anfragen?
• eingeschränkten Rückgabeobjekten?
• (alternativen) Sortierungen?
• alternativen Rückgabeformat?
Und wie sieht es mit „allgemeiner“ Suche aus?
#WISSENTEILEN
REST & Queries
// FILTERING: List of paid orders (2015-12-20)
// Common Style
GET /orders?date=20151220&status=payed HTTP/1.1
[various other headers]
#WISSENTEILEN
REST & Queries
// FILTERING: Details of order 3: product, date & status
// Facebook Style
GET /orders/3?fields=product,date,status HTTP/1.1
[various other headers]
GET /orders/3?fields=item.product,date,status HTTP/1.1
[various other headers]
// LinkedIn Style
GET /orders/3:(product, date, status) HTTP/1.1
[various other headers]
#WISSENTEILEN
REST & Queries
// FILTERING: Details of order 3
// without date, status
GET /orders/3?exclude=date,status HTTP/1.1
[various other headers]
// predefined payload (compact = product, date, status)
GET /orders/3?style=compact HTTP/1.1
[various other headers]
BTW: what does
„compact“ mean?
#WISSENTEILEN
REST & Queries
// FILTERING: Details of order 3
// using PREFER HEADER for response payload definition
GET /orders/3 HTTP/1.1
Content-Type: application/json
Prefer: return=compact-format
HTTP 1.1 200 OK
Content-Type: application/json; charset=utf-8
Preference-Applied: return=compact
#WISSENTEILEN
REST & Queries
// SORTING: List of 10 orders sorted by date and item
// SQL Style
GET /orders?sort=date+DESC,item+ASC&count=10 HTTP/1.1
// Sort and asc/desc combination, ascending as default
GET /orders?sort=date,item&desc=date&count=10 HTTP/1.1
// use prefix „-“ for descending, ascending as default
GET /orders?sort=-date,item&count=10 HTTP/1.1
#WISSENTEILEN
REST & Queries
// FORMATS: List of orders in alternative format xml
// Google style
GET /orders?alt=xml HTTP/1.1
// Foursquare style (v1)
GET /orders.xml HTTP/1.1
// Digg style
GET /orders?type=xml HTTP/1.1
Accept: application/xml
#WISSENTEILEN
REST & Queries
// FULL TEXT SEARCH: Fulltext search for „coffee“
// Global style
GET /search?q=coffee HTTP/1.1
// Scoped style
GET /orders/search?q=coffee HTTP/1.1
GET /orders?q=coffee HTTP/1.1
// Formatted style
GET /search.xml?q=coffee HTTP/1.1
GET /orders/search.xml?q=coffee HTTP/1.1
#WISSENTEILEN
REST & Queries
// ADVANCED SEARCH: „coffee with milk for 2 €“
// Query for ...
GET /orders?type=coffee&ingredient=milk&price=2 HTTP/1.1
BTW: AND or OR or
AND/OR?
#WISSENTEILEN
REST & Queries
// ADVANCED SEARCH: „coffee WITH milk for LESS THAN 2 €“
// Query for ...
GET /orders?
query=type=coffee+ingredient=milk+price<=2
Build your own
„Query Language“?
RQL
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
#WISSENTEILEN
RQL
// ADVANCED SEARCH: „coffee WITH milk for LESS THAN 2 €“
// RQL query ... (must possibly be encoded!)
GET /orders?query=
and(eq(type,coffee),
or(eq(ingredients,MILK),lt(price,2))
// RQL alternative query – FIQL (URI friendly) - ...
GET /orders?query=
type==coff*;(ingredients==MILK,price=lt=2)
#WISSENTEILEN
demo$ reql
demo$ |
#WISSENTEILEN
GraphQL
#WISSENTEILEN
GraphQL
#WISSENTEILEN
GraphQL
GraphQL
#WISSENTEILEN
Wer genau ist eigentlich dieser „Luke“?
• GET .../people/1
GraphQL
#WISSENTEILEN
Wer genau ist eigentlich dieser „Luke“ und in
welchen Filmen hat er mitgespielt?
• GET .../film/1
• GET .../film/2
• GET .../film/3
• GET .../people/1/films (if offered via Endpoint)
GraphQL
#WISSENTEILEN
Wer genau ist eigentlich dieser „Luke“ und in
welchen Filmen hat er mitgespielt und auf
welchen Schiffen ist er gefahren?
• GET .../starship/12
• GET .../starship/22
• GET .../peolple/1/starship (if offered)
GraphQL
#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 Schiffe auf
denen er gefahren ist?
• GET .../#1?F#CKING/detail (n+1 problem?)
• GET .../#1?F#CKING/all (job problem)
#WISSENTEILEN
GraphQL
Umdenken du musst!
GraphQL
#WISSENTEILEN
GraphQL Motivation
„ We see a conflict between the desire to load
all information in a single round trip while
keeping REST resources well isolated.”
(Facebook,	2012)
GraphQL
#WISSENTEILEN
GraphQL Idee
• Beliebige Abfragen via Objekt-Graph
auf dem ich navigieren kann.
• Lieferung des Abfrage-Results in einem
einzigen Round-Trip.
#WISSENTEILEN
GraphQL
#WISSENTEILEN
GraphQL
#WISSENTEILEN
GraphQL
GraphQL
#WISSENTEILEN
GraphQL Charakteristika
• hierarchicial
• product centric
• strongly typed & instrospective
• client specific queries
• application-layer protokol
#WISSENTEILEN
GraphQL
Fragen, was du willst,
du musst!
GraphQL
#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 Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
GraphQL
#WISSENTEILEN
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
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
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?
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
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?
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
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?
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
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?
{
person(name=„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
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?
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
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?
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
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?
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
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?
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
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?
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
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?
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
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?
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
#WISSENTEILEN
demo$ graphQL
demo$ |
#WISSENTEILEN
GraphiQL
#WISSENTEILEN
GraphiQL
(http://graphql-swapi.parseapp.com)
GraphQL
#WISSENTEILEN
Woher weiß das Backend was ich will?
• API Schema als gemeinsame Basis
• Query als Anfrage vom Client
• Step 1: parse (Query into AST)
• Step 2: validate (against Schema)
• Step 3: execute (Resolve Functions)
#WISSENTEILEN
GraphQL
// 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
}
#WISSENTEILEN
GraphQL
Aggregation?
Aggregation?
Aggregation?
#WISSENTEILEN
GraphQL
Aggregation!
GraphQL
#WISSENTEILEN
GraphQL Server
• Query Parser
• Data Fetcher
• Data Aggregator
• Caching von Result Graphs
• Aktualisierung von Result Graphs
GraphQL
#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
#WISSENTEILEN
Ist das wirklich so einfach?
• relative neue Technologie (im Fluss)
• Chaching?
• Dupletten?
• Information Hiding?
• Versionierung (vs. deprecated)
Async
Sync
vs.
#WISSENTEILEN
Sync vs. Async
A: POST /orders <order …>
B: ...
#WISSENTEILEN
Sync vs. Async
B: OK 201 <order 1234 …
<link „status“ … />
<link „update“ … />
<link „cancel“ … />
<link „pay“ … />
/>
A: POST /orders <order …>
#WISSENTEILEN
Sync vs. Async
A: POST /orders <order …>
B: Berlin, we have a problem (?)
#WISSENTEILEN
Sync vs. Async
REST und ...	
• Verbindungsproblem?
• Bearbeitungsfehler?
• Call	wiederholen?	
• Seiteneffekte!
• HTTP	Status	Codes
• Error	Payload
#WISSENTEILEN
Sync vs. Async
REST und ...	
• Fire &	Forget?
• Async Communication
• Passt	nicht	so	richtig	ins	
REST-Konzept,	oder?
Sync vs. Async
#WISSENTEILEN
Asyn Kommunikation
• via Messaging und Events
• lose Kopplung durch Queues & Topics
oder durch Event Observer
• ein Sender, 0 is N Receiver
• garantierte Auslieferung möglich
• garantierte Auslieferung erzeugt Overhead
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
Messaging	und ...	
• Senderprobleme?
• Falsches	Format
• Retry durch	Sender
• Reliable Messages	(ACK)
• evtl.	Duplicate
#WISSENTEILEN
Sync vs. Async
Messaging	und ...	
• Syncrone Kommunikation?
• 2x	Async =	Sync ;-)
• Correlation ID	
• Latenz	beachten
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
demo$ messaging
demo$ |
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
BTW: still sync!
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
#WISSENTEILEN
Sync vs. Async
Web Sockets
#WISSENTEILEN
Web Sockets 1x1
• Paradigmenwechsel in der Kommunikation
• Abkehr vom klassischen Request/Response
• Client meldet sich am Server an
• Full duplex „real time“ Kommunikation
• Session kann durch beide beendet werden
#WISSENTEILEN
Web Sockets
#WISSENTEILEN
Web Sockets
#WISSENTEILEN
Web Sockets
#WISSENTEILEN
Web Sockets
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ...
Origin: http://example.com
Sec-WebSocket-Protocol: chat, ...
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: ...
Web Sockets
#WISSENTEILEN
WebSocket „Alternativen“
• Polling (e.g. via Ajax)
• Long Polling
• Piggy Back
#WISSENTEILEN
Web Sockets
#WISSENTEILEN
Web Sockets
Web Sockets
#WISSENTEILEN
Can i use Web Sockets ... (Server Side)
• Java EE 7
• Spring
• Apache ActiveMQ, Caucho Resin,
Jetty, Netty, vert.x, jWebsocket
and many more ...
(see also	https://dzone.com/asset/download/253)
#WISSENTEILEN
demo$ websockets
demo$ |
#WISSENTEILEN
Sync vs. Async
WebSocket!
#WISSENTEILEN
#WISSENTEILEN
If you use REST,
use it at it‘s best.
FAZIT
#WISSENTEILEN
It‘s not REST
if it‘s not pragmatic.
FAZIT
#WISSENTEILEN
If it‘s not pragmatic
don‘t use REST!
FAZIT
#WISSENTEILEN
#WISSENTEILEN
? # !
LARS RÖWEKAMP
CIO NEW TECHNOLOGIES
lars.roewekamp@openknowledge.de
+49 (0) 441 4082 – 0
@mobileLarson
@_openknowledge
OFFENKUNDIGGUT
KOTAKT
#WISSENTEILEN
#1: © mantinov– shutterstock.com
#16: © Ollyy – shutterstock.com
#40: © pathdoc – shutterstock.com
#52: TODO: iStock_000059091620_Large.jpg
#119: © marekuliasz– shutterstock.com
#4, #23, #25, #29: #44: pixabay.com
Icons in this presentation designed by “Freepik”,
BILDNACHWEISE
#WISSENTEILEN

Web APIs jenseits von REST & Request/Response

  • 1.
    Web APIs Jenseits vonREST & Request/Response Lars Röwekamp CIO New Technologies @mobileLarson @_openknowledge #WISSENTEILEN
  • 2.
    Branchenneutrale Softwareentwicklung undIT-Beratung ÜBER OPEN KNOWLEDGE #WISSENTEILEN
  • 3.
    Lars Röwekamp (a.k.a.@mobileLarson) ÜBER MICH LR #WISSENTEILEN Wer bin ich - und wen ja, wie viele? • CIO New Technologies • Enterprise & Mobile • Author, Speaker, Coach & Mentor • Snowboard & MTB Enthusiast • mehrfacher Vater, einfacher Ehemann
  • 4.
  • 5.
    Das kleine REST1x1 #WISSENTEILEN REpresentational State Transfer is about ... • Architectural Design Style • Client-Server • Stateless • Cache • Uniform Interface • Layered System
  • 6.
    Das kleine REST1x1 #WISSENTEILEN REpresentational State Transfer • Identifikation durch URL • Manipulation durch Representation • Selbstbeschreibende Messages • Hypermedia /orders/123JSON/XML GET, POST, PUT, DELETE Media Types, Headers, ...References
  • 7.
    Das kleine REST1x1 #WISSENTEILEN ... /orders/ ... /orders/123 Liste aller Bestellungen einzelne Bestellung 123 erzeuge neuen Bestellung ERROR ändere „Liste“ von Bestellung ändere Bestellung 123 sonst ERROR lösche alle Bestellungen lösche Bestellung 123 Nomen GET POST PUT DELETE Single Item URIList URI Plural
  • 8.
    Das kleine REST1x1 #WISSENTEILEN Golden rules of REST • „We only need two URLs“ • „Verbs are bad, nouns are good“ • „Plurals are even better“ • „The web is your friend“ • „There is always a root (associations)“ • „There is always a parameter (complex stuff)“
  • 9.
    Das kleine REST1x1 #WISSENTEILEN „There is always a root“ • GET /orders/123/ingredients • GET /orders/123/ingredients/456 • GET /orders/123/ingredients/milk • PUT /orders/123/ingredients/milk • POST /orders/123/ingredients/milk • DELETE /orders/123/ingredients/milk
  • 10.
    Das kleine REST1x1 #WISSENTEILEN „There is always a parameter“ • Path für Ressource Identifier • Query für Abfrageparameter, Filter, etc. • Body für Ressource-spezifische Logik • Header für globale, plattformweite Parameter
  • 11.
  • 12.
    Das kleine REST1x1 #WISSENTEILEN Headers? Pro Tipp: Use them! • Version-Header • Location-Header • Accept-Header • Content-Type • Link-Header • X-Custom-Header (Override Method, Limit, ...)
  • 13.
    Das kleine REST1x1 #WISSENTEILEN Status Codes? Pro Tipp: Use them! • 1xx: Hold on ... • 2xx: Here you go! • 3xx: Go away! • 4xx: You f#!?ed up! • 5xx: I f#!?ed up!
  • 14.
    Das kleine REST1x1 #WISSENTEILEN Status Codes? Pro Tipp: Use them! • 1xx: Hold on ... • 2xx: Here you go! • 3xx: Go away! • 4xx: You f#!?ed up! • 5xx: I f#!?ed up! (http://restlet.com/http-status-codes-map)
  • 15.
    Das kleine REST1x1 #WISSENTEILEN HATEOAS? Pro Tipp: ... WAIT! • What the heck is Hateoas?
  • 16.
  • 17.
    #WISSENTEILEN REST & Hateoas „Ifthe engine of application state (and hence the API) is not driven by hypertext, then it cannot be RESTful and cannot be a REST API.“ Roy Fielding
  • 18.
  • 19.
    #WISSENTEILEN REST & Hateoas „AREST API should be entered with no prior knowledge beyond the initial URI ... From that point on, all application state transitions must be driven by the client selection of server-provides choices ...“ Roy Fielding
  • 20.
  • 21.
    #WISSENTEILEN REST & Hateoas //Response with link header for HYPERMEDIA navigation // after calling „POST .../orders/ <order ... />“ HTTP/1.1. 201 Created [various other headers] Link: <.../orders/1234>; rel=„cancel“ <.../orders/1234>; rel=„update“, <.../orders/1234>; rel=„delete“, <.../payment/1234>; rel=„pay“
  • 22.
    #WISSENTEILEN REST & Hateoas //Response with link header for HYPERMEDIA navigation // after calling „GET .../orders?page=10“ HTTP/1.1. 206 Partial Content [various other headers] Link: <.../orders?page=1>; rel=„first“ <.../orders?page=9>; rel=„next“, <.../orders?page=11>; rel=„prev“, <.../orders?page=17>; rel=„last“
  • 23.
  • 24.
    #WISSENTEILEN REST & Hateoas //Response with link header for HYPERMEDIA navigation // after calling „GET .../orders?page=10“ HTTP/1.1. 206 Partial Content [various other headers] Link: <.../orders?page=1>; rel=„first“ <.../orders?page=9>; rel=„next“, <.../orders?page=11>; rel=„prev“, <.../orders?page=17>; rel=„last“ Wait, does this make sense?
  • 25.
  • 26.
    REST & Pagination #WISSENTEILEN Wienavigiere ich durch Ressourcen? • Path Parameter? • Query Parameter? • Client Side Calculation? • Server Side Calculation?
  • 27.
    #WISSENTEILEN REST & Pagination //List page 4 of offers // Is page a query parameter? GET /offers?page=4 HTTP/1.1 // Or is page a „virtual“ resource? GET /offers/page/4 HTTP/1.1 BTW: what does „page 4“ mean?
  • 28.
    #WISSENTEILEN REST & Pagination //List next 5 offers starting from offer 10 // Or is page x a result of offset and limit? GET /offers?offset=10&limit=5 HTTP/1.1 // Response with success code and link header for // navigation purpose HTTP/1.1. 206 Partial content Link: <.../orders?offset=0&limit=5>; rel=„first“ <.../orders?offset=5&limit=5>; rel=„prev“, <.../orders?offset=15&limit=5>; rel=„next“, <.../orders?offset=40&limit=2>; rel=„last“ BTW: What‘s about filtering, sorting, ....
  • 29.
  • 30.
    REST & Queries #WISSENTEILEN Wasist eigentlich mit ... • komplex(er)en Anfragen? • eingeschränkten Rückgabeobjekten? • (alternativen) Sortierungen? • alternativen Rückgabeformat? Und wie sieht es mit „allgemeiner“ Suche aus?
  • 31.
    #WISSENTEILEN REST & Queries //FILTERING: List of paid orders (2015-12-20) // Common Style GET /orders?date=20151220&status=payed HTTP/1.1 [various other headers]
  • 32.
    #WISSENTEILEN REST & Queries //FILTERING: Details of order 3: product, date & status // Facebook Style GET /orders/3?fields=product,date,status HTTP/1.1 [various other headers] GET /orders/3?fields=item.product,date,status HTTP/1.1 [various other headers] // LinkedIn Style GET /orders/3:(product, date, status) HTTP/1.1 [various other headers]
  • 33.
    #WISSENTEILEN REST & Queries //FILTERING: Details of order 3 // without date, status GET /orders/3?exclude=date,status HTTP/1.1 [various other headers] // predefined payload (compact = product, date, status) GET /orders/3?style=compact HTTP/1.1 [various other headers] BTW: what does „compact“ mean?
  • 34.
    #WISSENTEILEN REST & Queries //FILTERING: Details of order 3 // using PREFER HEADER for response payload definition GET /orders/3 HTTP/1.1 Content-Type: application/json Prefer: return=compact-format HTTP 1.1 200 OK Content-Type: application/json; charset=utf-8 Preference-Applied: return=compact
  • 35.
    #WISSENTEILEN REST & Queries //SORTING: List of 10 orders sorted by date and item // SQL Style GET /orders?sort=date+DESC,item+ASC&count=10 HTTP/1.1 // Sort and asc/desc combination, ascending as default GET /orders?sort=date,item&desc=date&count=10 HTTP/1.1 // use prefix „-“ for descending, ascending as default GET /orders?sort=-date,item&count=10 HTTP/1.1
  • 36.
    #WISSENTEILEN REST & Queries //FORMATS: List of orders in alternative format xml // Google style GET /orders?alt=xml HTTP/1.1 // Foursquare style (v1) GET /orders.xml HTTP/1.1 // Digg style GET /orders?type=xml HTTP/1.1 Accept: application/xml
  • 37.
    #WISSENTEILEN REST & Queries //FULL TEXT SEARCH: Fulltext search for „coffee“ // Global style GET /search?q=coffee HTTP/1.1 // Scoped style GET /orders/search?q=coffee HTTP/1.1 GET /orders?q=coffee HTTP/1.1 // Formatted style GET /search.xml?q=coffee HTTP/1.1 GET /orders/search.xml?q=coffee HTTP/1.1
  • 38.
    #WISSENTEILEN REST & Queries //ADVANCED SEARCH: „coffee with milk for 2 €“ // Query for ... GET /orders?type=coffee&ingredient=milk&price=2 HTTP/1.1 BTW: AND or OR or AND/OR?
  • 39.
    #WISSENTEILEN REST & Queries //ADVANCED SEARCH: „coffee WITH milk for LESS THAN 2 €“ // Query for ... GET /orders? query=type=coffee+ingredient=milk+price<=2 Build your own „Query Language“?
  • 40.
  • 41.
    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
  • 42.
    #WISSENTEILEN RQL // ADVANCED SEARCH:„coffee WITH milk for LESS THAN 2 €“ // RQL query ... (must possibly be encoded!) GET /orders?query= and(eq(type,coffee), or(eq(ingredients,MILK),lt(price,2)) // RQL alternative query – FIQL (URI friendly) - ... GET /orders?query= type==coff*;(ingredients==MILK,price=lt=2)
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
    GraphQL #WISSENTEILEN Wer genau isteigentlich dieser „Luke“? • GET .../people/1
  • 49.
    GraphQL #WISSENTEILEN Wer genau isteigentlich dieser „Luke“ und in welchen Filmen hat er mitgespielt? • GET .../film/1 • GET .../film/2 • GET .../film/3 • GET .../people/1/films (if offered via Endpoint)
  • 50.
    GraphQL #WISSENTEILEN Wer genau isteigentlich dieser „Luke“ und in welchen Filmen hat er mitgespielt und auf welchen Schiffen ist er gefahren? • GET .../starship/12 • GET .../starship/22 • GET .../peolple/1/starship (if offered)
  • 51.
    GraphQL #WISSENTEILEN Wie alt istLuke 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? • GET .../#1?F#CKING/detail (n+1 problem?) • GET .../#1?F#CKING/all (job problem)
  • 52.
  • 53.
    GraphQL #WISSENTEILEN GraphQL Motivation „ Wesee a conflict between the desire to load all information in a single round trip while keeping REST resources well isolated.” (Facebook, 2012)
  • 54.
    GraphQL #WISSENTEILEN GraphQL Idee • BeliebigeAbfragen via Objekt-Graph auf dem ich navigieren kann. • Lieferung des Abfrage-Results in einem einzigen Round-Trip.
  • 55.
  • 56.
  • 57.
  • 58.
    GraphQL #WISSENTEILEN GraphQL Charakteristika • hierarchicial •product centric • strongly typed & instrospective • client specific queries • application-layer protokol
  • 59.
  • 60.
    GraphQL #WISSENTEILEN Wie alt istLuke 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?
  • 61.
  • 62.
    #WISSENTEILEN GraphQL Wie alt istLuke 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?
  • 63.
    #WISSENTEILEN GraphQL Wie alt istLuke 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?
  • 64.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name:„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 65.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name:„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 66.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name:„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 67.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name=„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 68.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name:„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 69.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name:„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 70.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name:„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 71.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name:„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 72.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name:„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 73.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name:„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 74.
    #WISSENTEILEN GraphQL Wie alt istLuke 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? { person(name:„Luke“) { haircolor, age films { name, openiningCrawl } starships { name, price } } }
  • 75.
  • 76.
  • 77.
  • 78.
    GraphQL #WISSENTEILEN Woher weiß dasBackend was ich will? • API Schema als gemeinsame Basis • Query als Anfrage vom Client • Step 1: parse (Query into AST) • Step 2: validate (against Schema) • Step 3: execute (Resolve Functions)
  • 79.
    #WISSENTEILEN GraphQL // A verysimple 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 }
  • 80.
  • 81.
  • 82.
    GraphQL #WISSENTEILEN GraphQL Server • QueryParser • Data Fetcher • Data Aggregator • Caching von Result Graphs • Aktualisierung von Result Graphs
  • 83.
    GraphQL #WISSENTEILEN Muss ich dasalles 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
  • 84.
    GraphQL #WISSENTEILEN Ist das wirklichso einfach? • relative neue Technologie (im Fluss) • Chaching? • Dupletten? • Information Hiding? • Versionierung (vs. deprecated)
  • 85.
  • 86.
    #WISSENTEILEN Sync vs. Async A:POST /orders <order …> B: ...
  • 87.
    #WISSENTEILEN Sync vs. Async B:OK 201 <order 1234 … <link „status“ … /> <link „update“ … /> <link „cancel“ … /> <link „pay“ … /> /> A: POST /orders <order …>
  • 88.
    #WISSENTEILEN Sync vs. Async A:POST /orders <order …> B: Berlin, we have a problem (?)
  • 89.
    #WISSENTEILEN Sync vs. Async RESTund ... • Verbindungsproblem? • Bearbeitungsfehler? • Call wiederholen? • Seiteneffekte! • HTTP Status Codes • Error Payload
  • 90.
    #WISSENTEILEN Sync vs. Async RESTund ... • Fire & Forget? • Async Communication • Passt nicht so richtig ins REST-Konzept, oder?
  • 91.
    Sync vs. Async #WISSENTEILEN AsynKommunikation • via Messaging und Events • lose Kopplung durch Queues & Topics oder durch Event Observer • ein Sender, 0 is N Receiver • garantierte Auslieferung möglich • garantierte Auslieferung erzeugt Overhead
  • 92.
  • 93.
  • 94.
  • 95.
    #WISSENTEILEN Sync vs. Async Messaging und... • Senderprobleme? • Falsches Format • Retry durch Sender • Reliable Messages (ACK) • evtl. Duplicate
  • 96.
    #WISSENTEILEN Sync vs. Async Messaging und... • Syncrone Kommunikation? • 2x Async = Sync ;-) • Correlation ID • Latenz beachten
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
    Web Sockets #WISSENTEILEN Web Sockets1x1 • Paradigmenwechsel in der Kommunikation • Abkehr vom klassischen Request/Response • Client meldet sich am Server an • Full duplex „real time“ Kommunikation • Session kann durch beide beendet werden
  • 115.
  • 116.
  • 117.
  • 118.
    #WISSENTEILEN Web Sockets GET /chatHTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: ... Origin: http://example.com Sec-WebSocket-Protocol: chat, ... Sec-WebSocket-Version: 13 HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: ...
  • 119.
    Web Sockets #WISSENTEILEN WebSocket „Alternativen“ •Polling (e.g. via Ajax) • Long Polling • Piggy Back
  • 120.
  • 121.
  • 122.
    Web Sockets #WISSENTEILEN Can iuse Web Sockets ... (Server Side) • Java EE 7 • Spring • Apache ActiveMQ, Caucho Resin, Jetty, Netty, vert.x, jWebsocket and many more ... (see also https://dzone.com/asset/download/253)
  • 123.
  • 124.
  • 125.
  • 126.
    #WISSENTEILEN If you useREST, use it at it‘s best. FAZIT
  • 127.
    #WISSENTEILEN It‘s not REST ifit‘s not pragmatic. FAZIT
  • 128.
    #WISSENTEILEN If it‘s notpragmatic don‘t use REST! FAZIT
  • 129.
  • 130.
  • 131.
    LARS RÖWEKAMP CIO NEWTECHNOLOGIES lars.roewekamp@openknowledge.de +49 (0) 441 4082 – 0 @mobileLarson @_openknowledge OFFENKUNDIGGUT KOTAKT #WISSENTEILEN
  • 132.
    #1: © mantinov–shutterstock.com #16: © Ollyy – shutterstock.com #40: © pathdoc – shutterstock.com #52: TODO: iStock_000059091620_Large.jpg #119: © marekuliasz– shutterstock.com #4, #23, #25, #29: #44: pixabay.com Icons in this presentation designed by “Freepik”, BILDNACHWEISE #WISSENTEILEN