Hypermedia API
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Hypermedia API

on

  • 3,758 views

Marat Kamenschykov presentation at Rubyshift 2012.

Marat Kamenschykov presentation at Rubyshift 2012.

Statistics

Views

Total Views
3,758
Views on SlideShare
3,522
Embed Views
236

Actions

Likes
3
Downloads
14
Comments
0

7 Embeds 236

http://svitla.local.com 95
http://svitla.com 80
http://www.svitla.com 45
http://test.svitla.com 8
https://twitter.com 5
http://192.168.1.33 2
http://www.linkedin.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Hypermedia API Presentation Transcript

  • 1. What is Hypermedia API?
  • 2. client code <=> API code
  • 3. API:1. namespace2. its functions3. their params
  • 4. Web API: 1. domain (https://graph.facebook.com/) 2. addresses (/users, /groups, etc)3. params for them (?access_token=...&...)
  • 5. The main API problem:Client-server coupling
  • 6. Change in domain, URL, params → clients brake
  • 7. WWW exists 20 years. Clients dont brake
  • 8. You can upgrade at any time.
  • 9. Hypermedia API = Web API + Web experience
  • 10. Hypermedia API = 1 URL https://api.github.com/https://api.twilio.com/2010-04-01
  • 11. Where are the URLs and params?
  • 12. MIME type description
  • 13. application/vnd.github-issue.text+jsonapplication/jsonapplication/vnd.tekpub.productions+jsonapplication/vnd.spire-io.session+json
  • 14. RFC2119: MUST, SHALL, REQUIRED SHOULD, RECOMMENDED MAY, OPTIONAL MUST NOT, SHALL NOTSHOULD NOT, NOT RECOMMENDED
  • 15. E.g.:Response representations MUST begin with <root> element as the first element
  • 16. Servers SHOULD return a response code of 204 if the HTTP DELETE request was successful.
  • 17. Document MAY contain a single filters object. Five properties: href(REQUIRED), rel (REQUIRED), name (OPTIONAL), prompt(OPTIONAL), and a data array (OPTIONAL)
  • 18. "filters":[ {"rel":"category", "href":"...","prompt":"", "data":[ {"name":"category", "value":"Microsoft"}]}, {"rel":"category", "href":"...","prompt":"", "data":[{"name":"category", "value":"Ruby"}]}]
  • 19. "filters":[ {"rel":"category", "href":"...","prompt":"", "data":[ {"name":"category", "value":"Microsoft"}]}, {"rel":"category", "href":"...","prompt":"", "data":[{"name":"category", "value":"Ruby"}]}]
  • 20. Rels are described in MIME
  • 21. Best MIME type is XHTML: it supports forms!
  • 22. 3 whales:HTTP + MIME + HATEOAS
  • 23. HATEOAS: hypermedia as the engine of application state
  • 24. <root> <root> <id>q0</id> <id>q1</id> <link rel = "q1" <link rel = "q0" uri = "..." /> uri = "..." /> <link rel = "q2" <link rel = "q3" uri = "..." /> uri = "..." /></entry> </entry>
  • 25. ticket: { assigned_to: someone, links: [ {rel: “unassign”, url: “...”}, {rel: “close”, url: “...”} ]}
  • 26. ticket: { assigned_to: null, links: [ {rel: “assign”, url: “...”}, {rel: “remove”, url: “...”} ]}
  • 27. *MIME types are registered in IANA w/ public access
  • 28. HTTP:
  • 29. HTTP verbs: GET HEAD POST PUT PATCH DELETE OPTIONS
  • 30. HTTP verbs: GET HEAD POST PUT PATCH DELETE OPTIONS
  • 31. Status codes:100.upto(505).almost_each do |status_code|…end
  • 32. 100 Continue 201 Created 202 Accepted 206 Partial Content 303 See Other 400 Bad Request 401 Unauthorized 404 Not Found 409 Conflict412 Precondition Failed 417 Expectation Failed
  • 33. 100 Continue 201 Created 202 Accepted 206 Partial Content 303 See Other 400 Bad Request 401 Unauthorized 404 Not Found 409 Conflict412 Precondition Failed 417 Expectation Failed
  • 34. 100 Continue 201 Created 202 Accepted 206 Partial Content 303 See Other 400 Bad Request 401 Unauthorized 404 Not Found 409 Conflict412 Precondition Failed 417 Expectation Failed
  • 35. 100 Continue 201 Created 202 Accepted 206 Partial Content 303 See Other 400 Bad Request 401 Unauthorized 404 Not Found 409 Conflict412 Precondition Failed 417 Expectation Failed
  • 36. 100 Continue 201 Created 202 Accepted 206 Partial Content 303 See Other 400 Bad Request 401 Unauthorized 404 Not Found 409 Conflict412 Precondition Failed 417 Expectation Failed
  • 37. 100 Continue 201 Created 202 Accepted 206 Partial Content 303 See Other 400 Bad Request 401 Unauthorized 404 Not Found 409 Conflict412 Precondition Failed 417 Expectation Failed
  • 38. Request headers:OPTIONS /payment/order/1234HTTP 1.1Host: starbucks.example.comResponse200 OK Allow: GET, PUT
  • 39. Request headers:PUT /order/1234 HTTP 1.1Host: starbucks.example.comExpect: 100-ContinueResponse:100 Continue
  • 40. Request:PUT /order/1234 HTTP 1.1Host: starbucks.example.com{body}Response:200 OK{body}
  • 41. Request:PUT /order/1234 HTTP 1.1Host: starbucks.example.com{body}Response:409 Conflict
  • 42. Request:PUT /order/1234 HTTP 1.1Host: starbucks.example.comExpect: 100-ContinueResponse:417 Expectation Failed
  • 43. HTTP Headers:Accept/typeEtagCacheAuthorizationVersionIf-Unmodified-SinceIf-Match
  • 44. HTTP Headers:Accept/typeEtagCacheAuthorizationVersionIf-Unmodified-SinceIf-Match
  • 45. Media types (revisited):Accept: application/xmlAccept: application/json
  • 46. GET https://api.github.com/gists/1Accept: application/json200 OKContent-Type: application/json; charset=utf-8(response body)
  • 47. GET https://api.github.com/gists/1Accept: application/xml200 OKContent-Type: application/xml; charset=utf-8(response body)
  • 48. GET https://api.github.com/gists/1Accept: application/xml406 Not AcceptableContent-Type: application/json{"message": "Must ACCEPT application/json:["application/xml"]"}
  • 49. HTTP Headers:Accept/typeEtagCacheAuthorizationVersionIf-Unmodified-SinceIf-Match
  • 50. GET https://api.github.com/gists/1Accept: application/json200 OKETag: "2259b5bea67655550030acf98bad4184"{body}GET https://api.github.com/gists/1Accept: application/jsonIf-None-Match:"2259b5bea67655550030acf98bad4184"304 Not Modified
  • 51. HTTP Headers:Accept/typeEtagCacheAuthorizationVersionIf-Unmodified-SinceIf-Match
  • 52. Authentication:Basic HTTP Authentication (with SSL or Digesting)
  • 53. HTTP Headers:Accept/typeEtagCacheAuthorizationVersionIf-Unmodified-SinceIf-Match
  • 54. Accept: application/vnd.example+jsonAccept: application/vnd.example+json;version=1.0 Accept: application/vnd.example-v2+json Start point URI remains: http://api.example.com
  • 55. HTTP Headers:Accept/typeEtagCacheAuthorizationVersionIf-Unmodified-SinceIf-Match
  • 56. Richardson Maturity Model
  • 57. 1. “The Swamp of POX.” You’re using HTTPto make RPC calls. HTTP is only really used as a tunnel.http://api.example.com?post_id=1&user_id=2
  • 58. 2. Resources. Rather than making every call to a service endpoint, you have multiple endpoints. http://api.example.com/posts/edit/1 http://api.example.com/users/show/1
  • 59. 3. HTTP Verbs. GET http://api.example.com/posts/1 PUT http://api.example.com/posts/1PATCH http://api.example.com/posts/1 POST http://api.example.com/postsDELETE http://api.example.com/posts/1
  • 60. 4. Hypermedia Controls. HATEOAS. You’re 100% REST compliant. GET https://api.example.com/ HTTP 1.1 Accept: application/vnd.example-v1+json If-Match: “...” Authentication: ... 200 OK {root: {entries: ...}, links: [{rel: “edit”, url: “...”}, {…}]}
  • 61. No client-server coupling 1 stable URLNo dependencies on URLs and params
  • 62. Client is valid forever (ideally)
  • 63. Just as web browsers work
  • 64. Wish you all to be at level 4 (if you want)
  • 65. Thank you! @maratkamenmarat@svitla.com
  • 66. Sources:
  • 67. “Architectural Styles and the Design of Network-based Software Architectures”http://www.ics.uci.edu/~fielding/pubs/di ssertation/top.htm
  • 68. http://blog.steveklabnik.com/posts/2012-02- 27-hypermedia-api-reading-list
  • 69. “Building Hypermedia APIs with HTML5 and Node” Mike Amundsen
  • 70. http://timelessrepo.com/haters-gonna-hateoas
  • 71. REST is over!http://blog.steveklabnik.com/posts/2012-02- 23-rest-is-over
  • 72. Questions!