euroclojure2014: schema & swagger - making your clojure web apis more awesome

68
Schema & Swagger making your Clojure web APIs more awesome EuroClojure 2014 Tommi Reiman @ikitommi

Upload: metosin

Post on 06-May-2015

2.207 views

Category:

Technology


0 download

DESCRIPTION

Euroclojure 2014 slides, the Sausage api found in https://github.com/ikitommi/euroclojure2014

TRANSCRIPT

Page 1: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Schema & Swagger���making your Clojure web APIs more awesome

EuroClojure 2014 Tommi Reiman

@ikitommi

Page 2: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Topics •  (Too) simple web api in Clojure •  Prismatic Schema •  Swagger •  Ring-swagger •  Compojure-api •  Fnhouse-swagger •  Wrapup

Page 3: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

(Too) simple web api in Clojure

D

git  clone  h,ps://github.com/ikitommi/euroclojure2014.git    

Page 4: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

The sausage •  Id •  Name •  (Length) •  (Description) •  Origin – Country –  (City)

h,p://www.swe

etpoland.com/    

Page 5: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

How do I program with sausages?

Page 6: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Java Sausage

Page 7: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Scala Sausage

Page 8: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Clojure Sausage?

Help  me!!  

Page 9: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Clojure Sausage?

A  Schema  is  a  Clojure(Script)  data  structure  describing  a  data  shape,  which  can  be  used  to  document  and  validate  func=ons  and  data.  

h,ps://github.com/prismaAc/schema  

Page 10: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Schema Sausage?

Page 11: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Schema Sausage?

Page 12: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc validation

Page 13: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Bydgoszcz & Tampere

h,p://en.wikipedia.org/wiki/Bydgoszcz     h,p://kuvat2.huuto.net/f/4f/1cdb0858b03c69122e9c06f9554a2-­‐orig.jpg    

Page 14: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc elements

Page 15: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc functions

Page 16: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

perf

Page 17: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

perf

“For  now  our  pragmaAc  soluAon  is  to  only  turn  on  validaAon  at  key  boundaries  in  producAon  code  

(using  :always-­‐validate),  and  only  check  the  remaining  asserAons  in  tests.    In  pracAce  this  seems  to  

catch  nearly  all  the  issues,  without  causing  any  performance  

problems.”          -­‐  Jason  Wolfe  

Page 18: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc coercion

Coerce!  Coerce!  

Page 19: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc goodies •  Double schema •  Schema selectors •  Generative Schema •  Schema-tools •  Contribs •  Ring-Swagger

Page 20: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc goodies Double  schema  

Page 21: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc goodies Schema  selectors  

Page 22: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc goodies

h,ps://gist.github.com/davegolland/3bc4277fe109e7b11770    

GeneraAve  Schema  

Page 23: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc goodies

h,ps://github.com/PrismaAc/om-­‐tools    

Om-­‐tools  

Page 24: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc goodies

h,ps://github.com/sfx/schema-­‐contrib      

Contribs  

h,ps://github.com/cddr/integrity    

Page 25: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sc goodies

h,ps://github.com/metosin/ring-­‐swagger    

Ring-­‐Swagger  

Page 26: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Swagger

Page 27: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Swagger •  a specification and complete framework implementation for

describing, producing, consuming, and visualizing RESTful web services –  https://helloreverb.com/developers/swagger

•  Existing adapters for most common web stacks •  Clojure Libs

–  Octohipster (https://github.com/myfreeweb/octohipster) –  Swag (https://github.com/narkisr/swag) –  Ring-Swagger

•  Compojure-Api (https://github.com/metosin/compojure-api) •  Fnhouse-swagger (https://github.com/metosin/fnhouse-swagger)

Page 28: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Resource listing

Page 29: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Api declarations

Page 30: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

(JSON) Schema definitions

Page 31: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Swagger UI

Page 32: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Swagger UI

Page 33: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Code-gen •  Client generators –  Scala, Flash, Java, Objc, PHP, Python, Python3, Ruby

•  Javascript via swagger-js •  Also server-stub generators … no clojure-support yet (anyone?)

Page 34: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Swagger-socket

h,ps://github.com/wordnik/swaggersocket  

Page 35: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Swagger editor

Page 36: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Swagger 2.0

coming  up.  

Page 37: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Ring-Swagger

Page 38: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Ring-Swagger •  Swagger implementation for Ring –  https://github.com/metosin/ring-swagger –  Based on Schema for data models & coercion

•  Extendable mappings of Schemas to JSON Schemas •  Symmetric parsers for common types (inc. Dates, DateTimes) •  Add-ons (coercers, predicates, tools)

–  Provides Swagger spec endpoints as Ring routes •  Resource-listing, Api-declarations, Swagger-UI

–  Independent to routing-libs •  Currently bindings exist to Compojure-Api and fnHouse

Page 39: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Ring-Swagger

>  

Page 40: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Ring-Swagger

Page 41: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Ring-Swagger

Page 42: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Ring-Swagger

Page 43: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Ring-Swagger

...    should  be  easier  to  extend.  

Page 44: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Ring-Swagger-UI •  Jar-packaged version of the Swagger-ui

–  https://github.com/metosin/ring-swagger-ui

Page 45: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

So, where is my���Sausage API?

Page 46: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Compojure-api

Page 47: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Compojure-Api •  An extendable web api lib on top of Compojure –  https://github.com/metosin/compojure-api –  Macros & middlewares with good defaults –  Schema-based models & coercion –  Swagger docs

Page 48: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Restructured handlers

Page 49: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Restructured handlers

Page 50: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Restructured handlers

Page 51: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Restructured handlers

DIY  :for-­‐roles  [:admin  :user]  

Page 52: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sausage API, take one

Page 53: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Sausage API, take one

?  

D

Page 54: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

•  Macro-fu to reverse-engineer the route tree at macro-expansion time –  No runtime penalty –  Static routes (no ad-hoc hypermedia)

•  Storing compiled route tree in 1)  Evil Mutable State, part1: globally side-effecting macro 2)  Evil Mutable State, part2: macro-filled global atom 3)  Current: Namespace cluttering local Var 4)  Next up: Dynamic Var?

Route Resolution

Page 55: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Route Resolution: Macro-peeling

Page 56: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Route Resolution: Macro-peeling

Page 57: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Route Resolution: Macro-peeling

Page 58: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Swagger it.

D

Page 59: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Try it.

Page 60: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

fnhouse

Page 61: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

fnhouse •  Fnhouse is a library that

builds on top of ring to provide a concise way to write web handlers safely, readably, without global variables, without repeating yourself, and with hooks to do much more.

•  https://github.com/Prismatic/fnhouse

Page 62: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

fnhouse •  Defnks with metadata è annotated handler –  Builds on schema & plumbing

•  Bootstrap: collect defnks & wrap to ring-handlers

•  No global state

Page 63: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

fnhouse

h,ps://www.youtube.com/watch?v=VEDLSvSSMSk&index=27&list=PLZdCLR02grLp__wRg5OTavVj4wefg69hM    

Page 64: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

fnhouse-swagger •  https://github.com/metosin/fnhouse-swagger •  fnhouse.swagger (54 loc) •  bootstrap it:

Page 65: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Final chapter

Page 66: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Schema & Swagger •  Prismatic Schema is an awesome tool – Describe, validate & coerce your data

•  Swagger to publish out api descriptions •  Building on top of ring-swagger: – Compojure-api è declarative web apis –  Fnhouse-swagger è meta-data done right – YourFavouriteWebLib è just do it (& poke us).

Page 67: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Next things @ Metosin •  Ring-Swagger –  Make feature complete (+Swagger 2.0)

•  Compojure-Api –  Cleanup route-peeling –  Ring-middleware-format –  Repl-tools?

•  Help others to adapt •  kekkonen.io –  CQRS-lib

Page 68: Euroclojure2014: Schema & Swagger - making your Clojure web APIs more awesome

Thanks.  @metosin  @ikitommi