SlideShare ist ein Scribd-Unternehmen logo
1 von 90
Downloaden Sie, um offline zu lesen
REST and Jersey Introduction



             Chris Winters
      Pittsburgh Java User Group
              21 April 2009




                   
Did you update the URLs?




    (slide 13: update with IP so people can access)




                            
Anyone want to vent?




              
Who am I?
       http://www.cwinters.com/ (not the male model)
       Dad of awesome two year­old
       Software Architect at Vocollect Healthcare Systems
       Most experience on very small teams
       AccuNurse: voice­assisted care for nursing homes
       We use many, many opensource libraries
       Not a REST expert, just very interested

                                 
REST
       Representational State Transfer
       Defined in Roy Fielding dissertation
       One primary implementation to­date: web + HTTP
       Why the interest?
       Web: ubiquitous, scalable, enabling platform




                                 
HTTP Success
       Text­based!
       Simple!
       Universal!
       Clients and servers aren't tightly bound




                                  
HTTP Success, Deeper
       Supports very simple + very complex apps
       Lots of options to scale, not just single path
       Stateless by default
       ...which means it's easy to test
       Those aren't documents, they're resources!
       ...and a resource ~~ distributed object


                                   
So? I'm not building Amazon
       Simplicity
       Flexibility
       Evolvability
       Testability
       Discoverability
       ...all good things, not related to scaling


                                    
A few initial warnings
       Resource­oriented very useful approach
       ...tough to purely implement with browsers
       ...and it requires some mind bending
       Still worthwhile!
       REST != HTTP (but we'll use it anyway)
       Show a good deal of code


                                 
Map
       What is REST?
       REST in Java
       What is REST?
       REST in Java
       ...




                          
In the beginning...
       "REST" was created looking back at HTTP
       But the guy who created REST 
        also helped create HTTP
       His dissertation is very readable!




                                  
REST boiled down
       Give every "thing" an ID
       Link things together
       Use standard methods
       Resources with multiple representations
       Communicate statelessly




        (from Stefan Tilkov, awesome REST guy)
                                  
Our dorky little application
       Notem: record notes, become group memory
       Potential: Dynamic notes (~~IRC bots)




                                
Access Notem now!
       Crude interface, but easy to navigate
       Web:
        http://10.4.13.146:8765
       Data:
        http://10.4.13.146:8765/r/
       Distribution:
        http://10.4.13.146:8765/notem-0.25.zip
       Slides:
        http://10.4.13.146:8765/cwinters_rest.pdf

                                  
Notem resources
       Resource = 'state with URI' (lots else too)
       Every note
       Every collection of notes 
       Initial workspace




                                  
Jersey intro
                RI of JSR­311, Sun 
                 folks primary on team
                Heavily reliant on 
                 annotations
                Skeptical before, but 
                 I'm a believer!




          
Jersey Extensibility
       Highly extensible
       @Provider means: "Hey Jersey, plug this in!"
       Examples: TemplateProvider, JAXB items
       Contextual items can be injected with @Context
       Contextual: UriInfo, HttpHeaders, Security
       Interesting bit: getting contextual data down to 
        objects manipulated by other frameworks (JAXB) 

                                 
RBD #1: An ID for
                    everything
       ID == URI
       I == Identifier, L == Location
       Globally unique, routeable identifier
       They don't have to be pretty!
       'Thing' can have broad meaning:
           Collection of other things
           Process that can report state

                                          
'Routeable' identifier?
       Most think of ID as primary key: 42
       Maybe: table:ID
       Maybe: server:database:table:ID
       ...where 'server' lookup into local registry
       Even if that worked, what would it return?




                                   
URI works everywhere
       Built on top of basic plumbing (DNS, hostnames)
       Protocol specification built­in (http://, ftp://)
       Abstraction built­in too:
           what I want (URL)
           how to shuffle it around (HTTP)
           not how to fetch/generate




                                     
Common misconception: URI
        design
       "Hackable" URIs nice, not necessary
       Only constraint is that they're unique
       BDUF: Lay out entire URI scheme
       Agile: Define as you go, refactor mercilessly




                                  
RBD #1: Jersey help
       Every resource has an enforced unique URI
       ...not much beyond that




                                   
RBD #2: Link things
                  together
       Use server­provided URIs as references
       Clients building URIs is a common mistake! 
       Limit URI templates to query­building hints
       HATEOAS




                                 
URI templates?
       On server­side, hugely useful
       Declare variables from URI, map to method params
       Also available: regex matching




                                 
HATEOAS?
       Hypertext As The Engine 
        of Application State
       RTF uses "the hypermedia 
        constraint" instead




                               
HATEOAS!
       Server­controlled links define what clients can do
       You can move hosts!
       Shard data!
       Change URIs!
       And potentially all this without taking systems down




                                  
HATEOAS + refactoring
       Refactoring another benefit of HATEOAS
       Client dependent on server for state transitions
       ...immediately change 
        client behavior
       Seems simple, but 
        we're just used to it
       Start simple, grow 
        organically
                                  
Clients cannot assume
             resource structure!
       Everything the client can do is created by server
       Client and server can know beforehand about media 
        types and types of transitions
       Different 'rel' types in 'link' element...
       OPTIONS informs about allowed methods
           Jersey: application.wadl
       Ways to know you're not doing HATEOAS...

                                    
'REST endpoint'
       “Here's the endpoint for our REST API”
       REST exposes resources many URIs
       Not actions via a few




                                 
URI scheme up front
       “Here are all the URIs in our REST API”
       ...implies out­of­band info important to app flow 
       Client discover resources moving through system
       Publishing your URI structure is coupling




                                  
Clients parse URIs
       “Here's the data you'll need from the URI”
       URI is opaque identifier
       Content of resource should be standalone
       Example: /blog/2009/04/20/my_hair_isnt_that_bad
           Does content have date in it too?
       API forces client to parse URIs: more coupling


                                    
URIs name actions
       Flickr API URIs name actions vs resources
        /services/rest/?method=flickr.test.echo...

       REST has uniform interface! (more later)
       Specifying methods/actions == RPC




                                 
RPC + Coupling


"Today's example is the SocialSite 
REST API. That is RPC. It screams RPC. 
There is so much coupling on display that it 
should be given an X rating."

­ Roy Fielding, 
REST APIs must be hypertext driven

                          
So bad about coupling?
       Evolvability
       Dependencies on structure inhibits evolution
       Do you expose your database tables?
       Or your libraries?
       If you choose to, it's a trade­off
       ...just one that REST explicitly chooses differently


                                    
URIs and the real world
       Easier to publish API that says "Send datablob A to 
        URI B and X will occur"
       IMO REST client development, generic or 
        otherwise, still early days...
       ...you do what you can




                                  
More HATEOAS
       Lots of recent discussion on this:
           rest­discuss posts (including Solomon Duskis)
           Subbu: "On Linking"
           Craig McC on Sun Cloud API




                                     
Generating links
       Underdeveloped area
       Componentize link generation?
       Should a resource generate its own URI?
       How to inject context (host/port) down?
       Manipulate rules at runtime?
           Example: Reference all Employee objects at host frodo
           Example: ...all Buildings with area > 25000 to gondor

                                      
RBD #2: Jersey Help

“...this is probably the hardest area. JAX­RS 
provides a bunch of ways to construct URIs but 
there is no such URI binding facility with a 
modeling API, such as JAXB.”

­ Paul Sandoz
InfoQ announcement: JSR 311 Final


                         
RBD #3: Use standard
                methods
       AKA, 'uniform interface'
       Methods never vary based on resources
       Key constraint that allows intermediaries to function
       Google knows GET is safe, can spider your site
       ...except when it's not safe




                                    
Dangers of unsafe GET

    "[The Alexa toolbar] logged into the 
    administrative area and followed the 
    'delete' link for every entry," the admin 
    says. "My dumb­ass boss still didn't 
    want to uninstall Alexa ­­ could have 
    strangled the man."
    ­ Stupid user tricks 3: IT admin follies


                           
Methods have semantics
       Key difference from RPC systems
       HTTP defines what GET/PUT/DELETE mean
       ...on any resource
       Idempotent: invoke multiple times with same effect
       What will service.updateOrder() do if called twice?
       What about service.takeOrder()?
       POST is the catch­all, the 'process' method

                                  
Standard methods +
           idempotency

Method   Purpose                 Idempotent? Safe?
===================================================
GET      Retrieve representation     Y          Y
PUT      Provide representation      Y          N
POST     Create/extend resource      N          N
DELETE   Delete resource             Y          N
HEAD     GET minus body              Y          Y
OPTIONS Find methods for resource    Y          Y




                           
Which does RPC-over-HTTP
               use?


Method   Purpose                 Idempotent? Safe?
===================================================
POST     Create/extend resource    **N**      **N**




                           
Benefits of standard
                  methods
       Original name of REST: HTTP Object Model 
       All objects on the web can be manipulated similarly
       Implementation hiding: what language? what 
        model? who cares?
       Generic invocation: no need to generate code for 
        actions, only data



                                 
Where are my methods?
              Constraint!
       Yes, GET/PUT/DELETE/POST are constraints
       Ask anyone who writes: can sharpen focus
       Thinking in uniform 
        methods key to ROA




                                
Nouning verbs
       One pattern for adapting action­centric designs is 
                      [1]
        nouning verbs
       Canonical example: transactions
       Treat the transaction as a resource with status
       Reference the resource in your actions – client 
        maintains application state! (more later) 



[1] Because “resourcing verbs” sounds too Office Space-y
                                  
Nouning Transactions




              
TMTOWTDI
       Instead of referencing the resource, maybe I could  
        POST different resources to the transaction?
       ...transaction resource could passthru resources
       There are multiple ways to do it: that's the point
       Actions­as­resources takes a while, but useful




                                   
RBD #3: Jersey support
       Awesome
       Annotations for all major HTTP methods
       @HEAD coming in JAX­RS 1.1




                                
Sidetrack: Jersey resources
       “How does Jersey discover my resources?”
       Define Application which explicitly names
       Tell Jersey to scan your package
       Wire into your DI framework (Spring/Guice)
       Also true of @Provider implementations




                                 
Enabling evil

“Granted the abstraction of this messaging 
infrastructure led to bindings and dependencies 
that we are trying to get out of today, but that 
doesn't make RPC evil, it's the technologies and 
'programming style' that resulted from RPC that 
have become evil.”

­ Ebenezer Ikonne

                          
Avoiding evil
       Great presentation by Steve Vinoski on RPC history 
        discusses RPC issues
       Summary: Avoid
       ...if remote looks local, you will eventually lose




                                   
Current distributed systems
       Highly dependent on code generation, stubs
       Winds up treating 
        data­over­wire as opaque 
       ...will be difficult to reuse 
        on the same platform
       cross­platform? ha!



                                     
Defining service contracts


“Using a regular programming language to define 
supposedly abstract interfaces greatly increases 
the chances that language­specific constructs will 
leak into the contract.”

­ Steve Vinoski


                          
Problems with remote calls
       RPC should have high barrier to entry: it's hard!
       Very tight coupling
       Synchronization required (pre­3.0 entity beans?)
       Restricted failure modes
       Closed protocol (typically)
       And...


                                    
Fallacies of distributed
               computing
    1) The network is reliable.
    2) Latency is zero.
    3) Bandwidth is infinite.
    4) The network is secure.




                                   
Fallacies of distributed
                computing
    5) Topology doesn't change.
    6) There is one administrator.
    7) Transport cost is zero.
    8) The network is homogeneous.


    More: Fallacies of Distributed Computing Explained


                                  
RPC hopes
       System that solves problems inherent in distributed 
        computing.
       Examples Vinoski uses: REST and Erlang  
       Make explicit tradeoffs to work around limitations
       Echoing Fielding dissertation: it's all about tradeoffs




                                   
Focus on data!
       All this means: you're pushing the problem to data.
       This is good! You wind up there anyway. 




                                  
Sending data
       Historically representation tied to RPC system
       IIOP, DCE, RMI, SOAP + XML
       Instead, your data identified by media type
       Allows you to separate concerns:
           Library for processing media type
           Library for moving data through logic



                                     
RBD #4: Multiple
                 representations
       'Resource' is an abstract entity, a concept
       You only interact with representations
       With HTTP, content negotiation informs




                                   
HTTP: Accept
       Every request has an 'Accept' HTTP header
       Useful tools for seeing this in browser
       Useful tools for specifying from CLI
       RESTful service provides appropriate representation




                                  
Representations in Notem
       Three main ones, not applicable in all cases
       text/html, application/xml, application/json
       When using programmatic HTTP access it's easier 
        to control 




                                  
Representation
          communicates resource
       Others we could use?




                                
Representation
          communicates resource
       audio/mpeg: output of TTS engine
       application/ssml+xml: Speech synthesis markup (so 
        your TTS can speak the note)
       application/morse­code (madeup)
       Representations can be derived: not every one needs 
        to be PUTable



                                 
Designing representations
       Behooves you to use widely known media types
       "Get over the idea that your domain is a unique and 
        special snowflake"
       See Bill de Hora 
        "Snowflake APIs"




                                 
Media types

“A REST API should spend almost all of its 
descriptive effort in defining the media type(s) 
used for representing resources and driving 
application state...”

­ Roy Fielding, 
REST APIs must be hypertext driven


                           
RBD #4: Jersey support
       Awesome
       Declare @Produces and @Accepts for class or 
        methods
       Jersey parses Accept header and dispatches to the 
        right one




                                 
What's a valid return value?
       No interface required
       One known: javax.ws.rs.core.Response: status 
        + cookies, etag, entity...
       Others: try to match with MessageBodyWriter
       ...including list/array, though may be useful to have 
        explicit 'collection representation' to model 
        additional state


                                  
MessageBodyWriter
                 examples
       byte[] ­> ByteArrayProvider
       Viewable ­> ViewableMessageBodyWriter ­> 
        TemplateProvider
       JAXB­registered object ­> 
        JSONJAXBElementProvider || 
        XMLJAXBElementProvider




                                
Brief digression on JAXB
       Nifty technology!
       Tutorials focus on XML schemas and code 
        generation
       Skip all that, basic use is pretty easy




                                   
Marshalling sucks
       How many libraries? JiBX, XmlBeans, XStream...
       No silver bullet
       Marshalling always sucks, anyone who says 
        differently is selling you something




                                
RBD #5: Communicate
          statelessly
“...communication must be stateless in 
nature...such that each request from client to 
server must contain all of the information 
necessary to understand the request, and cannot 
take advantage of any stored context on the 
server. Session state is therefore kept entirely on 
the client.”

­ Roy Fielding, p.78­9.
                           
Benefits of statelessness
       Caching
       Scale out, not up
       Simple in some senses, not others




                                 
Different types of state
       Client: Application state is 'where' you are
       Server: Resource state is what you're manipulating
       Possible to represent application state as resource?




                                  
Examples of state
       Phone conversation: all 'application' state
       Client/server app: server holds open transactions, 
        current 'screen', relies on open connection
       Web app: current page of results, shopping cart, 
        current 'item' being worked on, GUI 
        customizations...




                                   
Shopping cart example
       Assuming a fully featured client
       ...how might we design a RESTful shopping cart?




                                 
RBD #5: Jersey support
       Really an implementation detail
       Jersey helps you DTRT, but you're free to break it




                                 
Why caching?
       The fastest DB query is the one never executed
       Nearly all applications are read­mostly: optimize!
       Transparently­added caching even better
       (view 'Many intermediaries image')
       The network is not transparent




                                  
Faking statefulness (test)
       Form data just key/value pairs
       Cookies just text
       HTTP Authentication just a header




                                 
'Architectural Style'


“An architectural style is a coordinated set of 
architectural constraints that restricts the 
roles/features of architectural elements and the 
allowed relationships among those elements 
within any architecture that conforms to that style.”

­ Roy Fielding, p. 13

                           
'Architectural Style'
       Abstraction for component interaction
       An architecture reflects its environment
       ...but hard to compare those from different 
        environments 
       It is not a set of defined messages




                                   
'Architecture Style'
       Alan Dean:
           A style can be applied to many different architectures.
           An architecture can consist of many different styles.




                                       
Pieces of the Style
       Client/Server (separation of concerns)
       Stateless communication
       Caching
       Uniform interface
       Layered system
       Code on demand


                                   
Style implications
     You will not be buying a 'REST Toolkit'
     One level up from tools allows evaluation of fit for 
      purpose
     Fielding dissertation opens with reference to Monty 
      Python sketch :
"It might very well be the best slaughterhouse design ever 
   conceived, but that would be of little comfort to the 
   prospective tenants as they are whisked along hallways 
   containing rotating knives."
­ Fielding
                                 
Other styles
       POX: Plain old XML: not bad <em>a priori</em>, 
        but,
           ... typically everything goes through POST (XML­RPC)
       MEST ('processThis()', see Jim Webber for more)
       "Low REST" vs "High REST" (RTF says it's 
        hogwash)



                                    
Now what?
       Evolvability is underrated
       Distributed systems are hard
       Try it! Building even a small system will introduce 
        new 'resources' that you probably haven't thought of
       Jersey is proof that JSRs can work




                                  
Thank you!




         
Resources on REST



    Collected on my site, slides are terrible for this:
            http://www.cwinters.com/rest/




                              
Attributions
       Testudo Shrug
       Tinkertoy Sticks 
       I hate zombies
       Mike Tomlin (Gregory Shamus/Getty Images)
       I Hate Mondays




                               

Weitere ähnliche Inhalte

Was ist angesagt?

Rest and Sling Resolution
Rest and Sling ResolutionRest and Sling Resolution
Rest and Sling Resolution
DEEPAK KHETAWAT
 
How to build a rest api.pptx
How to build a rest api.pptxHow to build a rest api.pptx
How to build a rest api.pptx
Harry Potter
 

Was ist angesagt? (20)

Rest web services
Rest web servicesRest web services
Rest web services
 
Overview of RESTful web services
Overview of RESTful web servicesOverview of RESTful web services
Overview of RESTful web services
 
RESTful Web Services
RESTful Web ServicesRESTful Web Services
RESTful Web Services
 
Spring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. RESTSpring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. REST
 
RESTful Web Services with JAX-RS
RESTful Web Services with JAX-RSRESTful Web Services with JAX-RS
RESTful Web Services with JAX-RS
 
Restful webservice
Restful webserviceRestful webservice
Restful webservice
 
Design Beautiful REST + JSON APIs
Design Beautiful REST + JSON APIsDesign Beautiful REST + JSON APIs
Design Beautiful REST + JSON APIs
 
L18 REST API Design
L18 REST API DesignL18 REST API Design
L18 REST API Design
 
REST & RESTful Web Services
REST & RESTful Web ServicesREST & RESTful Web Services
REST & RESTful Web Services
 
Building RESTful applications using Spring MVC
Building RESTful applications using Spring MVCBuilding RESTful applications using Spring MVC
Building RESTful applications using Spring MVC
 
The never-ending REST API design debate
The never-ending REST API design debateThe never-ending REST API design debate
The never-ending REST API design debate
 
REST & RESTful Web Service
REST & RESTful Web ServiceREST & RESTful Web Service
REST & RESTful Web Service
 
Rest and Sling Resolution
Rest and Sling ResolutionRest and Sling Resolution
Rest and Sling Resolution
 
Your rest api using laravel
Your rest api using laravelYour rest api using laravel
Your rest api using laravel
 
RESTEasy
RESTEasyRESTEasy
RESTEasy
 
How to build a rest api.pptx
How to build a rest api.pptxHow to build a rest api.pptx
How to build a rest api.pptx
 
Doing REST Right
Doing REST RightDoing REST Right
Doing REST Right
 
RESTful Web services using JAX-RS
RESTful Web services using JAX-RSRESTful Web services using JAX-RS
RESTful Web services using JAX-RS
 
REST API Laravel
REST API LaravelREST API Laravel
REST API Laravel
 
The never-ending REST API design debate -- Devoxx France 2016
The never-ending REST API design debate -- Devoxx France 2016The never-ending REST API design debate -- Devoxx France 2016
The never-ending REST API design debate -- Devoxx France 2016
 

Andere mochten auch

Jersey framework
Jersey frameworkJersey framework
Jersey framework
knight1128
 
New Jersey Presentation
New Jersey PresentationNew Jersey Presentation
New Jersey Presentation
Peggy Bloomer
 

Andere mochten auch (9)

RESTful Web Services with Jersey
RESTful Web Services with JerseyRESTful Web Services with Jersey
RESTful Web Services with Jersey
 
Jersey framework
Jersey frameworkJersey framework
Jersey framework
 
REST
RESTREST
REST
 
The Rest Architectural Style
The Rest Architectural StyleThe Rest Architectural Style
The Rest Architectural Style
 
New Jersey Presentation
New Jersey PresentationNew Jersey Presentation
New Jersey Presentation
 
Learn REST in 18 Slides
Learn REST in 18 SlidesLearn REST in 18 Slides
Learn REST in 18 Slides
 
REST Presentation
REST PresentationREST Presentation
REST Presentation
 
Understanding REST
Understanding RESTUnderstanding REST
Understanding REST
 
JSON and REST
JSON and RESTJSON and REST
JSON and REST
 

Ähnlich wie Introduction to REST and Jersey

Creating Web Services with Zend Framework - Matthew Turland
Creating Web Services with Zend Framework - Matthew TurlandCreating Web Services with Zend Framework - Matthew Turland
Creating Web Services with Zend Framework - Matthew Turland
Matthew Turland
 
Web technologies lesson 1
Web technologies   lesson 1Web technologies   lesson 1
Web technologies lesson 1
nhepner
 
Paul Fremantle Restful SOA Registry
Paul Fremantle Restful SOA RegistryPaul Fremantle Restful SOA Registry
Paul Fremantle Restful SOA Registry
deimos
 
Innovate2014 Better Integrations Through Open Interfaces
Innovate2014 Better Integrations Through Open InterfacesInnovate2014 Better Integrations Through Open Interfaces
Innovate2014 Better Integrations Through Open Interfaces
Steve Speicher
 
NoSQL - No Security?
NoSQL - No Security?NoSQL - No Security?
NoSQL - No Security?
Gavin Holt
 

Ähnlich wie Introduction to REST and Jersey (20)

Document Databases & RavenDB
Document Databases & RavenDBDocument Databases & RavenDB
Document Databases & RavenDB
 
Creating Restful Web Services with restish
Creating Restful Web Services with restishCreating Restful Web Services with restish
Creating Restful Web Services with restish
 
Understanding and Using Rest APIs (SocialDevCamp Chicago 2009)
Understanding and Using Rest APIs (SocialDevCamp Chicago 2009)Understanding and Using Rest APIs (SocialDevCamp Chicago 2009)
Understanding and Using Rest APIs (SocialDevCamp Chicago 2009)
 
Unerstanding and Using RESTful APIs
Unerstanding and Using RESTful APIsUnerstanding and Using RESTful APIs
Unerstanding and Using RESTful APIs
 
Introduction to REST and the Restlet Framework
Introduction to REST and the Restlet FrameworkIntroduction to REST and the Restlet Framework
Introduction to REST and the Restlet Framework
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
Creating Web Services with Zend Framework - Matthew Turland
Creating Web Services with Zend Framework - Matthew TurlandCreating Web Services with Zend Framework - Matthew Turland
Creating Web Services with Zend Framework - Matthew Turland
 
Enterprise REST
Enterprise RESTEnterprise REST
Enterprise REST
 
REST and Resource Oriented Architecture - okcDG March 2008
REST and Resource Oriented Architecture - okcDG March 2008REST and Resource Oriented Architecture - okcDG March 2008
REST and Resource Oriented Architecture - okcDG March 2008
 
Modified REST Presentation
Modified REST PresentationModified REST Presentation
Modified REST Presentation
 
Separating REST Facts from Fallacies
Separating REST Facts from FallaciesSeparating REST Facts from Fallacies
Separating REST Facts from Fallacies
 
REST vs WS-*: Myths Facts and Lies
REST vs WS-*: Myths Facts and LiesREST vs WS-*: Myths Facts and Lies
REST vs WS-*: Myths Facts and Lies
 
RESTful applications: The why and how by Maikel Mardjan
RESTful applications: The why and how by Maikel MardjanRESTful applications: The why and how by Maikel Mardjan
RESTful applications: The why and how by Maikel Mardjan
 
Web technologies lesson 1
Web technologies   lesson 1Web technologies   lesson 1
Web technologies lesson 1
 
Paul Fremantle Restful SOA Registry
Paul Fremantle Restful SOA RegistryPaul Fremantle Restful SOA Registry
Paul Fremantle Restful SOA Registry
 
Innovate2014 Better Integrations Through Open Interfaces
Innovate2014 Better Integrations Through Open InterfacesInnovate2014 Better Integrations Through Open Interfaces
Innovate2014 Better Integrations Through Open Interfaces
 
REST full API Design
REST full API DesignREST full API Design
REST full API Design
 
Connect js nodejs_api_shubhra
Connect js nodejs_api_shubhraConnect js nodejs_api_shubhra
Connect js nodejs_api_shubhra
 
Treinamento 1
Treinamento 1Treinamento 1
Treinamento 1
 
NoSQL - No Security?
NoSQL - No Security?NoSQL - No Security?
NoSQL - No Security?
 

Introduction to REST and Jersey

  • 1. REST and Jersey Introduction Chris Winters Pittsburgh Java User Group 21 April 2009    
  • 2. Did you update the URLs? (slide 13: update with IP so people can access)    
  • 3. Anyone want to vent?    
  • 4. Who am I?  http://www.cwinters.com/ (not the male model)  Dad of awesome two year­old  Software Architect at Vocollect Healthcare Systems  Most experience on very small teams  AccuNurse: voice­assisted care for nursing homes  We use many, many opensource libraries  Not a REST expert, just very interested    
  • 5. REST  Representational State Transfer  Defined in Roy Fielding dissertation  One primary implementation to­date: web + HTTP  Why the interest?  Web: ubiquitous, scalable, enabling platform    
  • 6. HTTP Success  Text­based!  Simple!  Universal!  Clients and servers aren't tightly bound    
  • 7. HTTP Success, Deeper  Supports very simple + very complex apps  Lots of options to scale, not just single path  Stateless by default  ...which means it's easy to test  Those aren't documents, they're resources!  ...and a resource ~~ distributed object    
  • 8. So? I'm not building Amazon  Simplicity  Flexibility  Evolvability  Testability  Discoverability  ...all good things, not related to scaling    
  • 9. A few initial warnings  Resource­oriented very useful approach  ...tough to purely implement with browsers  ...and it requires some mind bending  Still worthwhile!  REST != HTTP (but we'll use it anyway)  Show a good deal of code    
  • 10. Map  What is REST?  REST in Java  What is REST?  REST in Java  ...    
  • 11. In the beginning...  "REST" was created looking back at HTTP  But the guy who created REST  also helped create HTTP  His dissertation is very readable!    
  • 12. REST boiled down  Give every "thing" an ID  Link things together  Use standard methods  Resources with multiple representations  Communicate statelessly   (from Stefan Tilkov, awesome REST guy)  
  • 13. Our dorky little application  Notem: record notes, become group memory  Potential: Dynamic notes (~~IRC bots)    
  • 14. Access Notem now!  Crude interface, but easy to navigate  Web: http://10.4.13.146:8765  Data: http://10.4.13.146:8765/r/  Distribution: http://10.4.13.146:8765/notem-0.25.zip  Slides: http://10.4.13.146:8765/cwinters_rest.pdf    
  • 15. Notem resources  Resource = 'state with URI' (lots else too)  Every note  Every collection of notes   Initial workspace    
  • 16. Jersey intro  RI of JSR­311, Sun  folks primary on team  Heavily reliant on  annotations  Skeptical before, but  I'm a believer!    
  • 17. Jersey Extensibility  Highly extensible  @Provider means: "Hey Jersey, plug this in!"  Examples: TemplateProvider, JAXB items  Contextual items can be injected with @Context  Contextual: UriInfo, HttpHeaders, Security  Interesting bit: getting contextual data down to  objects manipulated by other frameworks (JAXB)     
  • 18. RBD #1: An ID for everything  ID == URI  I == Identifier, L == Location  Globally unique, routeable identifier  They don't have to be pretty!  'Thing' can have broad meaning:  Collection of other things  Process that can report state    
  • 19. 'Routeable' identifier?  Most think of ID as primary key: 42  Maybe: table:ID  Maybe: server:database:table:ID  ...where 'server' lookup into local registry  Even if that worked, what would it return?    
  • 20. URI works everywhere  Built on top of basic plumbing (DNS, hostnames)  Protocol specification built­in (http://, ftp://)  Abstraction built­in too:  what I want (URL)  how to shuffle it around (HTTP)  not how to fetch/generate    
  • 21. Common misconception: URI design  "Hackable" URIs nice, not necessary  Only constraint is that they're unique  BDUF: Lay out entire URI scheme  Agile: Define as you go, refactor mercilessly    
  • 22. RBD #1: Jersey help  Every resource has an enforced unique URI  ...not much beyond that    
  • 23. RBD #2: Link things together  Use server­provided URIs as references  Clients building URIs is a common mistake!   Limit URI templates to query­building hints  HATEOAS    
  • 24. URI templates?  On server­side, hugely useful  Declare variables from URI, map to method params  Also available: regex matching    
  • 25. HATEOAS?  Hypertext As The Engine  of Application State  RTF uses "the hypermedia  constraint" instead    
  • 26. HATEOAS!  Server­controlled links define what clients can do  You can move hosts!  Shard data!  Change URIs!  And potentially all this without taking systems down    
  • 27. HATEOAS + refactoring  Refactoring another benefit of HATEOAS  Client dependent on server for state transitions  ...immediately change  client behavior  Seems simple, but  we're just used to it  Start simple, grow  organically    
  • 28. Clients cannot assume resource structure!  Everything the client can do is created by server  Client and server can know beforehand about media  types and types of transitions  Different 'rel' types in 'link' element...  OPTIONS informs about allowed methods  Jersey: application.wadl  Ways to know you're not doing HATEOAS...    
  • 29. 'REST endpoint'  “Here's the endpoint for our REST API”  REST exposes resources many URIs  Not actions via a few    
  • 30. URI scheme up front  “Here are all the URIs in our REST API”  ...implies out­of­band info important to app flow   Client discover resources moving through system  Publishing your URI structure is coupling    
  • 31. Clients parse URIs  “Here's the data you'll need from the URI”  URI is opaque identifier  Content of resource should be standalone  Example: /blog/2009/04/20/my_hair_isnt_that_bad  Does content have date in it too?  API forces client to parse URIs: more coupling    
  • 32. URIs name actions  Flickr API URIs name actions vs resources /services/rest/?method=flickr.test.echo...  REST has uniform interface! (more later)  Specifying methods/actions == RPC    
  • 34. So bad about coupling?  Evolvability  Dependencies on structure inhibits evolution  Do you expose your database tables?  Or your libraries?  If you choose to, it's a trade­off  ...just one that REST explicitly chooses differently    
  • 35. URIs and the real world  Easier to publish API that says "Send datablob A to  URI B and X will occur"  IMO REST client development, generic or  otherwise, still early days...  ...you do what you can    
  • 36. More HATEOAS  Lots of recent discussion on this:  rest­discuss posts (including Solomon Duskis)  Subbu: "On Linking"  Craig McC on Sun Cloud API    
  • 37. Generating links  Underdeveloped area  Componentize link generation?  Should a resource generate its own URI?  How to inject context (host/port) down?  Manipulate rules at runtime?  Example: Reference all Employee objects at host frodo  Example: ...all Buildings with area > 25000 to gondor    
  • 38. RBD #2: Jersey Help “...this is probably the hardest area. JAX­RS  provides a bunch of ways to construct URIs but  there is no such URI binding facility with a  modeling API, such as JAXB.” ­ Paul Sandoz InfoQ announcement: JSR 311 Final    
  • 39. RBD #3: Use standard methods  AKA, 'uniform interface'  Methods never vary based on resources  Key constraint that allows intermediaries to function  Google knows GET is safe, can spider your site  ...except when it's not safe    
  • 40. Dangers of unsafe GET "[The Alexa toolbar] logged into the  administrative area and followed the  'delete' link for every entry," the admin  says. "My dumb­ass boss still didn't  want to uninstall Alexa ­­ could have  strangled the man." ­ Stupid user tricks 3: IT admin follies    
  • 41. Methods have semantics  Key difference from RPC systems  HTTP defines what GET/PUT/DELETE mean  ...on any resource  Idempotent: invoke multiple times with same effect  What will service.updateOrder() do if called twice?  What about service.takeOrder()?  POST is the catch­all, the 'process' method    
  • 42. Standard methods + idempotency Method Purpose Idempotent? Safe? =================================================== GET Retrieve representation Y Y PUT Provide representation Y N POST Create/extend resource N N DELETE Delete resource Y N HEAD GET minus body Y Y OPTIONS Find methods for resource Y Y    
  • 43. Which does RPC-over-HTTP use? Method Purpose Idempotent? Safe? =================================================== POST Create/extend resource **N** **N**    
  • 44. Benefits of standard methods  Original name of REST: HTTP Object Model   All objects on the web can be manipulated similarly  Implementation hiding: what language? what  model? who cares?  Generic invocation: no need to generate code for  actions, only data    
  • 45. Where are my methods? Constraint!  Yes, GET/PUT/DELETE/POST are constraints  Ask anyone who writes: can sharpen focus  Thinking in uniform  methods key to ROA    
  • 46. Nouning verbs  One pattern for adapting action­centric designs is  [1] nouning verbs  Canonical example: transactions  Treat the transaction as a resource with status  Reference the resource in your actions – client  maintains application state! (more later)  [1] Because “resourcing verbs” sounds too Office Space-y    
  • 48. TMTOWTDI  Instead of referencing the resource, maybe I could   POST different resources to the transaction?  ...transaction resource could passthru resources  There are multiple ways to do it: that's the point  Actions­as­resources takes a while, but useful    
  • 49. RBD #3: Jersey support  Awesome  Annotations for all major HTTP methods  @HEAD coming in JAX­RS 1.1    
  • 50. Sidetrack: Jersey resources  “How does Jersey discover my resources?”  Define Application which explicitly names  Tell Jersey to scan your package  Wire into your DI framework (Spring/Guice)  Also true of @Provider implementations    
  • 52. Avoiding evil  Great presentation by Steve Vinoski on RPC history  discusses RPC issues  Summary: Avoid  ...if remote looks local, you will eventually lose    
  • 53. Current distributed systems  Highly dependent on code generation, stubs  Winds up treating  data­over­wire as opaque   ...will be difficult to reuse  on the same platform  cross­platform? ha!    
  • 55. Problems with remote calls  RPC should have high barrier to entry: it's hard!  Very tight coupling  Synchronization required (pre­3.0 entity beans?)  Restricted failure modes  Closed protocol (typically)  And...    
  • 56. Fallacies of distributed computing 1) The network is reliable. 2) Latency is zero. 3) Bandwidth is infinite. 4) The network is secure.    
  • 57. Fallacies of distributed computing 5) Topology doesn't change. 6) There is one administrator. 7) Transport cost is zero. 8) The network is homogeneous. More: Fallacies of Distributed Computing Explained    
  • 58. RPC hopes  System that solves problems inherent in distributed  computing.  Examples Vinoski uses: REST and Erlang    Make explicit tradeoffs to work around limitations  Echoing Fielding dissertation: it's all about tradeoffs    
  • 59. Focus on data!  All this means: you're pushing the problem to data.  This is good! You wind up there anyway.     
  • 60. Sending data  Historically representation tied to RPC system  IIOP, DCE, RMI, SOAP + XML  Instead, your data identified by media type  Allows you to separate concerns:  Library for processing media type  Library for moving data through logic    
  • 61. RBD #4: Multiple representations  'Resource' is an abstract entity, a concept  You only interact with representations  With HTTP, content negotiation informs    
  • 62. HTTP: Accept  Every request has an 'Accept' HTTP header  Useful tools for seeing this in browser  Useful tools for specifying from CLI  RESTful service provides appropriate representation    
  • 63. Representations in Notem  Three main ones, not applicable in all cases  text/html, application/xml, application/json  When using programmatic HTTP access it's easier  to control     
  • 64. Representation communicates resource  Others we could use?    
  • 65. Representation communicates resource  audio/mpeg: output of TTS engine  application/ssml+xml: Speech synthesis markup (so  your TTS can speak the note)  application/morse­code (madeup)  Representations can be derived: not every one needs  to be PUTable    
  • 66. Designing representations  Behooves you to use widely known media types  "Get over the idea that your domain is a unique and  special snowflake"  See Bill de Hora  "Snowflake APIs"    
  • 68. RBD #4: Jersey support  Awesome  Declare @Produces and @Accepts for class or  methods  Jersey parses Accept header and dispatches to the  right one    
  • 69. What's a valid return value?  No interface required  One known: javax.ws.rs.core.Response: status  + cookies, etag, entity...  Others: try to match with MessageBodyWriter  ...including list/array, though may be useful to have  explicit 'collection representation' to model  additional state    
  • 70. MessageBodyWriter examples  byte[] ­> ByteArrayProvider  Viewable ­> ViewableMessageBodyWriter ­>  TemplateProvider  JAXB­registered object ­>  JSONJAXBElementProvider ||  XMLJAXBElementProvider    
  • 71. Brief digression on JAXB  Nifty technology!  Tutorials focus on XML schemas and code  generation  Skip all that, basic use is pretty easy    
  • 72. Marshalling sucks  How many libraries? JiBX, XmlBeans, XStream...  No silver bullet  Marshalling always sucks, anyone who says  differently is selling you something    
  • 73. RBD #5: Communicate statelessly “...communication must be stateless in  nature...such that each request from client to  server must contain all of the information  necessary to understand the request, and cannot  take advantage of any stored context on the  server. Session state is therefore kept entirely on  the client.” ­ Roy Fielding, p.78­9.    
  • 74. Benefits of statelessness  Caching  Scale out, not up  Simple in some senses, not others    
  • 75. Different types of state  Client: Application state is 'where' you are  Server: Resource state is what you're manipulating  Possible to represent application state as resource?    
  • 76. Examples of state  Phone conversation: all 'application' state  Client/server app: server holds open transactions,  current 'screen', relies on open connection  Web app: current page of results, shopping cart,  current 'item' being worked on, GUI  customizations...    
  • 77. Shopping cart example  Assuming a fully featured client  ...how might we design a RESTful shopping cart?    
  • 78. RBD #5: Jersey support  Really an implementation detail  Jersey helps you DTRT, but you're free to break it    
  • 79. Why caching?  The fastest DB query is the one never executed  Nearly all applications are read­mostly: optimize!  Transparently­added caching even better  (view 'Many intermediaries image')  The network is not transparent    
  • 80. Faking statefulness (test)  Form data just key/value pairs  Cookies just text  HTTP Authentication just a header    
  • 82. 'Architectural Style'  Abstraction for component interaction  An architecture reflects its environment  ...but hard to compare those from different  environments   It is not a set of defined messages    
  • 83. 'Architecture Style'  Alan Dean:  A style can be applied to many different architectures.  An architecture can consist of many different styles.    
  • 84. Pieces of the Style  Client/Server (separation of concerns)  Stateless communication  Caching  Uniform interface  Layered system  Code on demand    
  • 85. Style implications  You will not be buying a 'REST Toolkit'  One level up from tools allows evaluation of fit for  purpose  Fielding dissertation opens with reference to Monty  Python sketch : "It might very well be the best slaughterhouse design ever  conceived, but that would be of little comfort to the  prospective tenants as they are whisked along hallways  containing rotating knives." ­ Fielding    
  • 86. Other styles  POX: Plain old XML: not bad <em>a priori</em>,  but,  ... typically everything goes through POST (XML­RPC)  MEST ('processThis()', see Jim Webber for more)  "Low REST" vs "High REST" (RTF says it's  hogwash)    
  • 87. Now what?  Evolvability is underrated  Distributed systems are hard  Try it! Building even a small system will introduce  new 'resources' that you probably haven't thought of  Jersey is proof that JSRs can work    
  • 89. Resources on REST Collected on my site, slides are terrible for this: http://www.cwinters.com/rest/    
  • 90. Attributions  Testudo Shrug  Tinkertoy Sticks   I hate zombies  Mike Tomlin (Gregory Shamus/Getty Images)  I Hate Mondays