Your SlideShare is downloading. ×
Hypermedia API
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Hypermedia API

3,533
views

Published on

Marat Kamenschykov presentation at Rubyshift 2012.

Marat Kamenschykov presentation at Rubyshift 2012.

Published in: News & Politics

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,533
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
18
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

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!