Slide 1

Slide 1 text

Hypermedia APIs Hypermedia APIs Webmachine & ROAR 1 Larry Staton Jr. : @statonjr 1 Wednesday, 14 November 12

Slide 2

Slide 2 text

Hypermedia APIs Assumptions 2 2 Wednesday, 14 November 12

Slide 3

Slide 3 text

Hypermedia APIs REST 3 3 Wednesday, 14 November 12

Slide 4

Slide 4 text

Hypermedia APIs 4 Constraint Promotes Tradeoff client-server UI Portability Simplified server stateless Scalability Reliability Efficiency non-shared caching Reduced latency Efficiency Scalability Reliability uniform interface Independent Evolution Decoupled implementation Efficiency layered system Scalability Simplified clients Higher Latency code-on-demand Extensibility Simplified clients Visibility 4 Wednesday, 14 November 12

Slide 5

Slide 5 text

Hypermedia APIs 5 Uniform Interface 5 Wednesday, 14 November 12

Slide 6

Slide 6 text

Hypermedia APIs HTTP 6 6 Wednesday, 14 November 12

Slide 7

Slide 7 text

Hypermedia APIs 7 Constraint Promotes Tradeoff client-server UI Portability Simplified server stateless Scalability Reliability Efficiency non-shared caching Reduced latency Efficiency Scalability Reliability uniform interface Independent Evolution Decoupled implementation Efficiency layered system Scalability Simplified clients Higher Latency code-on-demand Extensibility Simplified clients Visibility 7 Wednesday, 14 November 12

Slide 8

Slide 8 text

Hypermedia APIs “REST APIs must be hypertext-driven” 8 — Fielding, 2009! 8 Wednesday, 14 November 12

Slide 9

Slide 9 text

Hypermedia APIs 9 Richardson Maturity Model 9 Wednesday, 14 November 12

Slide 10

Slide 10 text

Hypermedia APIs Hypermedia 10 10 Wednesday, 14 November 12

Slide 11

Slide 11 text

Hypermedia APIs Media Types 11 11 Wednesday, 14 November 12

Slide 12

Slide 12 text

Hypermedia APIs 12 Media Type Hypermedia? text/html application/atom+xml application/json application/hal+json 12 Wednesday, 14 November 12

Slide 13

Slide 13 text

Hypermedia APIs HTTP 13 13 Wednesday, 14 November 12

Slide 14

Slide 14 text

Hypermedia APIs 14 14 Wednesday, 14 November 12

Slide 15

Slide 15 text

Hypermedia APIs Webmachine 15 15 Wednesday, 14 November 12

Slide 16

Slide 16 text

Hypermedia APIs Resources 16 16 Wednesday, 14 November 12

Slide 17

Slide 17 text

Hypermedia APIs 17 class HomeResource < Webmachine::Resource def allowed_methods %W[GET] end def expires Time.now + 2.weeks end def languages_provided [“en-us”] end end 17 Wednesday, 14 November 12

Slide 18

Slide 18 text

Hypermedia APIs 18 allow_missing_post? allowed_methods base_uri charsets_provided content_types_accepted content_types_provided create_path delete_completed? delete_resource encodings_provided expires finish_request forbidden generate_etag is_authorized? is_conflict? known_content_type? known_methods language_chosen languages_provided last_modified malformed_request? moved_permanently? moved_temporarily? multiple_choices? options post_is_create? previously_existed? process_post resource_exists? service_available? uri_too_long? valid_content_headers? valid_entity_length? validate_content_checksum variances Callbacks 18 Wednesday, 14 November 12

Slide 19

Slide 19 text

Hypermedia APIs 19 Webmachine::Application.new do |app| app.routes do add [], HomeResource end end 19 Wednesday, 14 November 12

Slide 20

Slide 20 text

Hypermedia APIs Representation 20 20 Wednesday, 14 November 12

Slide 21

Slide 21 text

Hypermedia APIs HTML 21 21 Wednesday, 14 November 12

Slide 22

Slide 22 text

Hypermedia APIs 22 Vehicles Example HTML Representation 22 Wednesday, 14 November 12

Slide 23

Slide 23 text

Hypermedia APIs 23 class HomeResource < Webmachine::Resource … def content_types_provided [[‘text/html’, :to_html]] end def to_html template = Slim::Template.new(“home_representer.slim”) template.render end end 23 Wednesday, 14 November 12

Slide 24

Slide 24 text

Hypermedia APIs HAL+JSON 24 24 Wednesday, 14 November 12

Slide 25

Slide 25 text

Hypermedia APIs 25 { “_links”: { “self”: { “href”: “.../api” }, “vehicles”: { “href”: “.../vehicles” } } } Example HAL+JSON Representation 25 Wednesday, 14 November 12

Slide 26

Slide 26 text

Hypermedia APIs ROAR 26 26 Wednesday, 14 November 12

Slide 27

Slide 27 text

Hypermedia APIs 27 module HomeRepresenter include Roar::Representer::JSON include Roar::Representer::JSON::HAL include Roar::Representer::Feature::Hypermedia link :self do "/api" end link :vehicles do ".../vehicles" end end 27 Wednesday, 14 November 12

Slide 28

Slide 28 text

Hypermedia APIs 28 class HomeResource < Webmachine::Resource … def content_types_provided [[‘application/hal+json’, :to_hal]] end def to_hal home = Object.new.extend(HomeRepresenter) home.to_json end end 28 Wednesday, 14 November 12

Slide 29

Slide 29 text

Hypermedia APIs Next Steps 29 29 Wednesday, 14 November 12

Slide 30

Slide 30 text

Hypermedia APIs Conclusion 30 30 Wednesday, 14 November 12

Slide 31

Slide 31 text

Hypermedia APIs Questions? 31 31 Wednesday, 14 November 12

Slide 32

Slide 32 text

Hypermedia APIs Additional Resources 32 seancribbs/webmachine-ruby apotonick/roar Jon Moore’s 2010 Oredev talk Steve Klabnik: “Designing Hypermedia APIs” Mike Amundsen: “Building Hypermedia APIs” Webber/Robinson: “REST in Practice” RESTFest 32 Wednesday, 14 November 12