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

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply
Published

Marat Kamenschykov presentation at Rubyshift 2012.

Marat Kamenschykov presentation at Rubyshift 2012.

Published in News & Politics
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,371
On SlideShare
0
From Embeds
0
Number of Embeds
5

Actions

Shares
Downloads
17
Comments
0
Likes
3

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!