design hypermedia apis

51
DESIGN HYPERMEDIA APIS Gustaf Nilsson Kotte / @gustaf_nk

Upload: gustaf-nilsson-kotte

Post on 10-May-2015

5.454 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Design Hypermedia APIs

DESIGN HYPERMEDIA APISGustaf Nilsson Kotte / @gustaf_nk

Page 2: Design Hypermedia APIs

OUR TASKDesign an API for a kanban board. The API will have multiple clients.

Page 3: Design Hypermedia APIs

KANBAN BOARD

Page 4: Design Hypermedia APIs

API GET/POST items/

{ id: 123, name: "...", description: "...", status: "backlog|working|verify|done" }

Page 5: Design Hypermedia APIs

SERVER SIDE: ENFORCE RULESDon't trust clients

Page 6: Design Hypermedia APIs

CLIENT SIDE: USER FRIENDLY

Hide non-valid transitionsShow primary transitions "Read the specification"

Page 7: Design Hypermedia APIs

SPECIFICATION Implement the state machine on the right.

The primary action for each state is the "downward" arrow, except for the state "done" where the primary action is to move the item back to the "working" state.

Page 8: Design Hypermedia APIs

CLIENT SIDE VARIATIONS function nextStates(item) { if (item.state == 'backlog') return ['working']; else if (item.state == 'working') return ['backlog', 'verify']; ... } function getPrimary(state) { if (item.state == 'backlog') return 'working'; ... }

Page 9: Design Hypermedia APIs

CLIENT SIDE VARIATIONS function nextStates(item) { dict = { 'backlog' => ['working'], 'working' => ['backlog, verify'], ... return dict[item.state]; } function getPrimary(state) { if (item.state == 'backlog') return 'working'; ... }

Page 10: Design Hypermedia APIs

CLIENT SIDE VARIATIONS function nextStates(item) { dict = { 'backlog' => ['working'], 'working' => ['backlog, verify'], ... return dict[item.state]; } function isPrimary(state, nextState) { return nextState == nextStates(state).last(); }

Page 11: Design Hypermedia APIs

Many possibilities!

CLIENT SIDE VARIATIONS function nextStates(item) { var stateMachine = new StateMachine(conf.json);

return stateMachine.getTransitions(item.state); } function isPrimary(state, nextState) { return nextState == nextStates(state).last(); }

Page 12: Design Hypermedia APIs

WITHOUT HYPERMEDIA

Page 13: Design Hypermedia APIs

PREFER FAT APIS OVER FAT CLIENTS

Page 14: Design Hypermedia APIs

http://martinfowler.com/articles/richardsonMaturityModel.html

Page 15: Design Hypermedia APIs

HYPERMEDIA APIS

Page 16: Design Hypermedia APIs

WHAT IS THE HYPERMEDIA CONSTRAINT?

— Jon Moore

You do stuff by reading pages and then either

follow links or submit forms.

Page 17: Design Hypermedia APIs

DESIGN PROCESS1. Evaluate processes2. Create state machine3. Evaluate media types4. Create or choose media types5. Implementation6. Refinements

http://www.designinghypermediaapis.com

Page 18: Design Hypermedia APIs

1. EVALUATE PROCESSES

Page 19: Design Hypermedia APIs

1. EVALUATE PROCESSES

Collections: "board", backlog, working, verify, done Single: details, edit

Write: being able to change the state of an item according to the rules

Page 20: Design Hypermedia APIs

2. CREATE STATE MACHINE

Page 21: Design Hypermedia APIs

FIRST ATTEMPT...

Page 22: Design Hypermedia APIs

Simplified view

Page 23: Design Hypermedia APIs

Inline actions

Page 24: Design Hypermedia APIs

Better root node

Page 25: Design Hypermedia APIs

3. EVALUATE MEDIA TYPES

Page 26: Design Hypermedia APIs

H-FACTORS

http://amundsen.com/hypermedia/hfactor/

Page 27: Design Hypermedia APIs

H-FACTORS FOR OUR APILO: Support for out-bound navigational links (HTTP GET)LN: Support for non-idempotent updates (HTTP POST)CL: Support for adding semantic meaning to link elementsusing link relations

Page 28: Design Hypermedia APIs

4. CREATE OR CHOOSE MEDIA TYPES

Page 29: Design Hypermedia APIs

HTMLHALCollection+JSONSirenJSON-LDAtomSVGOData

Page 30: Design Hypermedia APIs

Name Summary Read/write Comment

HAL Resources and relations R Write support with addon

Collection+JSON Collections over JSON RW

Siren ~ JSON port of HTML RW

JSON-LD ~ RDF over JSON R

Page 31: Design Hypermedia APIs

USE HTML FOR HYPERMEDIA APIS

Lots of hypermedia controlsOld, standardized, everybody knows HTMLGood tooling support

https://vimeo.com/20781278http://codeartisan.blogspot.se/2012/07/using-html-as-media-type-for-your-api.html

http://amundsen.com/hypermedia/html/

Page 32: Design Hypermedia APIs

MORE...

Great for learning about hypermedia!

Page 33: Design Hypermedia APIs

EXAMPLE: MICROFORMATS2, ENTITIES<li class="h-item"> <div class="p-name"><%= item.name %></div> <div class="p-status"><%= item.status %></div> <div class="p-description"><%= item.description %></div> <div class="p-forms"> ... </div> <div class="p-links"> ... </div></li>

Page 34: Design Hypermedia APIs

EXAMPLE: MICROFORMATS2, FORMS<div class="p-forms"> <form data-rel="move backlog" action="/items/backlog" method="POST"> <input name="id" type="hidden" value="4"> <input title="submit" type="submit" value="Move to backlog"> </form> <form data-rel="move verify next" action="/items/verify" method="POST"> <input name="id" type="hidden" value="4"> <input title="submit" type="submit" value="Move to verify"> </form></div>

Page 35: Design Hypermedia APIs

5. IMPLEMENTATION

Page 36: Design Hypermedia APIs

6. REFINEMENTS

Page 37: Design Hypermedia APIs

(Better root node)

Page 38: Design Hypermedia APIs

Cache profiles analysis: Separate Board and Navigation

Page 39: Design Hypermedia APIs

DONE! JUST ONE MORE THING... :)

Page 40: Design Hypermedia APIs

WRITING A HYPERMEDIA AWARE CLIENT

Page 41: Design Hypermedia APIs

Not harder than writing a "regular" client, just different...

Page 42: Design Hypermedia APIs

...which means it's harder, since new to many developers :(

Page 43: Design Hypermedia APIs

GENERIC VS SPECIFIC CLIENT?

Page 44: Design Hypermedia APIs

STANDARDIZED DOMAIN VS

WALLED GARDEN"Atom client" vs "Twitter client"However, standard media types still have value!

Page 45: Design Hypermedia APIs

USE THE AFFORDANCESLink relations (navigational state)Form relations (server state)

Page 46: Design Hypermedia APIs

DEMO: CHANGING THE APPLICATION

Page 47: Design Hypermedia APIs

DEMO: RUBY CONSOLE CLIENT

Page 48: Design Hypermedia APIs

WHERE'S THE APPLICATION?

Page 49: Design Hypermedia APIs

SUMMARY

Page 50: Design Hypermedia APIs

BOOKS, Steve Klabnik Designing Hypermedia APIs

, Mike Amundsen Building Hypermedia APIswith HTML5 and Node

Page 51: Design Hypermedia APIs

THANK YOU!Gustaf Nilsson Kotte / @gustaf_nk

Code: https://github.com/gustafnk/kanban-awd-api

Demo: and http://kanban-awd.herokuapp.com/ http://kanban-api.herokuapp.com

Slides: http://www.slideshare.net/GustafKotte/design-hypermedia-apis