1 / 34

Getting Serious with Versioned APIs in Scala

Getting Serious with Versioned APIs in Scala. Derrick Isaacson, Director of Development. TIE. Paid. Free. Evolvability. Web Site or Web Service. Servers return XML IDs -> more HTTP requests Auth tokens, caching, content type negotiation Error status codes –> retries

chun
Download Presentation

Getting Serious with Versioned APIs in Scala

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Getting Serious with Versioned APIs in Scala Derrick Isaacson, Director of Development

  2. TIE Paid Free

  3. Evolvability

  4. Web Site or Web Service • Servers return XML • IDs -> more HTTP requests • Auth tokens, caching, content type negotiation • Error status codes –> retries • More XML, JPEG, other formats • Series of rendering steps

  5. “There is no magic dust that makes an HTTP request a web service request.” -Leonard Richardson & Sam Ruby, RESTful Web Services

  6. What is a “web service”?

  7. Distributed Computer Architectures • Distributed memory • RPC services • RESTful services • Distributed file systems • P2P networks • Streaming media

  8. Extensibility of REST Fielding Dissertation Section 4.1.2

  9. REST Components

  10. 1. Evolving the Resource (not the representation!) • Uniform identification of resources • Uniform resource manipulation • Representation separate from the identity • Hypermedia as the engine of application state • Self-descriptive messages

  11. 1. Evolving the Resource http://lucidchart.com/docs/MyHome/v1 http://lucidchart.com/docs/MyHome/v2

  12. REST Components

  13. 2. Evolving the Resource Identifier • Uniform identification of resources • Uniform resource manipulation • Representation separate from the identity • Hypermedia as the engine of application state • Self-descriptive messages

  14. 2. Evolving URLs & Hypermedia <diagram> … <images> <image> <id>123</id> </image> </images> </diagram> http://lucidchart.com/imgs/123 http://images.lucidchart.com/imgs/123

  15. 2. Evolving URLs & Hypermedia <diagram> … <images> <image> <id> http://images.lucidchart.com/imgs/123 </id> </image> </images> </diagram>

  16. 2. Evolving URLs & Uniform Response Codes 200 OK … <response> <status>Error</status> <msg>Not Found</msg> </response> http://lucidchart.com/imgs/123 http://images.lucidchart.com/imgs/123 404 Not Found … <userMsg> … </userMsg> 301 Moved Permanently Location: http://images... … fail

  17. 2. Hypermedia with Scala & Play #routes GET /users/{id} lucid.getUser(id) defgetUser(id: Int) = { valaccountURI = routes.App.userAccount(id) valtemplate = User(accountURI) Ok(template) }

  18. 2. Evolving URLs with Scala & Play # Images moved permanently GET /imgs/{id} lucid.redirectImages(id) defredirectImages(id: Int) = { vallocation = “http://images.lucidchart.com/images/”+id Redirect(location) }

  19. REST Components

  20. 3. Self-descriptive Messages GET /users/123 HTTP 1.1 Host: example.com User-Agent: XYZ 1.1 Accept: text/html, application/xhtml+xml, application/xml Keep-Alive: 300 Connection: keep-alive If-Modified-Since: Fri, 02 Sep 2013 16:47:31 GMT If-None-Match: "600028c-59fb-474f6852c9dab" Cache-Control: max-age=60 Date: Fri, 02 Sep 2013 16:47:31 GMT Via: 1.0, myproxy, 1.1 lucidchart.com (Apache/1.1) Authorization: Bearer mF_9.B5f-4.1JqM

  21. 3. Self-descriptive Messages HTTP/1.1 200 OK Date: Sun, 04 Oct 2013 19:36:25 GMT Server: Apache/2.2.11 (Debian) Last-Modified:Fri, 02 Oct 2013 16:48:39 GMT Etag: "600028c-59fb-474f6852c9dab" Cache-Control: max-age=300 Accept-Ranges: bytes Vary: Accept-Encoding Content-Type: application/xml Content-Encoding: gzip Content-Length: 7160 Keep-Alive: timeout=15,max=91 Connection: Keep-Alive

  22. 3. Evolving Resource Metadata & Control Data • Uniform identification of resources • Uniform resource manipulation • Representation separate from the identity • Hypermedia as the engine of application state • Self-descriptive messages

  23. REST Components

  24. 4. Evolving Representations GET /images/123 … 200 OK HTTP 1.1 Content-Type: application/xml … <response> <status>success</status> <id>123</id> <image>MTIzNmEyMTM…=</image> </response> GET /images/123 Accept: image/jpeg … 200 OK HTTP 1.1 Content-Type: image/jpeg … (jpeg image)

  25. 4. Evolving Representations Standard media types! http://microformats.org/ http://www.iana.org/assignments/media-types

  26. { name: “John Smith”, phone: “000-000-0000”, email: “john@example.com”, photo: “https://lucidchart.com/images/abc“, groups: “https://lucidchart.com/groups?user=123” account: “https://lucidchart.com/”, books: “https://books.example.com/catalog?ids=456…”, … } GET /users/123 { name: “John Smith”, phone: “000-000-0000”, email: “john@example.com”, photo: “YWZzYSAyMzR2NQzJ2dzLmZhc20uLC8uLA==“, groups: [ { id: 234, name: “Team A”, members: […] }, … ], account: { id: 345, company: “Big Enterprise”, …}, books: [ { id: 456, name: “RESTful Web Services”, publishDate: … }, { id: 567, name: “REST in Practice”, … }, … ], …

  27. 4. Custom Media Types X GET /diagrams/v1/123 HTTP/1.1 … GET /diagrams/v1/123 …

  28. 4. Custom Media Types GET /diagrams/123 HTTP/1.1 Accept: application/vnd.lucid.diagram+xml … GET /diagrams/123 HTTP/1.1 Accept: application/vnd.lucid.diagram-v2+xml …

  29. REST Components

  30. “The central feature that distinguishes the REST architectural style from other network-based styles is its emphasis on a uniform interface between components. By applying the software engineering principle of generality to the component interface, the overall system architecture is simplified and the visibility of interactions is improved. Implementations are decoupled from the services they provide, which encourages independent evolvability.”

  31. Q & A http://www.lucidchart.com/jobs

More Related