Upgrade to Pro — share decks privately, control downloads, hide ads and more …

REST with JAX-RS

REST with JAX-RS

An introduction to RESTful web services in Java using JAX-RS

Andreas Bjärlestam

September 15, 2009
Tweet

More Decks by Andreas Bjärlestam

Other Decks in Technology

Transcript

  1. ______/\\\\\\\\\\\_____/\\\\\\\\\_____/\\\_______/\\\________________/\\\\\\\\\_________/\\\\\\\\\\\___ ! _____\/////\\\///____/\\\\\\\\\\\\\__\///\\\___/\\\/_______________/\\\///////\\\_____/\\\/////////\\\_ ! _________\/\\\______/\\\/////////\\\___\///\\\\\\/________________\/\\\_____\/\\\____\//\\\______\///__ ! _________\/\\\_____\/\\\_______\/\\\_____\//\\\\_______/\\\\\\\\__\/\\\\\\\\\\\/______\////\\\_________ ! _________\/\\\_____\/\\\\\\\\\\\\\\\______\/\\\\______\////////___\/\\\//////\\\_________\////\\\______! _________\/\\\_____\/\\\/////////\\\______/\\\\\\_________________\/\\\____\//\\\___________\////\\\___!

    __/\\\___\/\\\_____\/\\\_______\/\\\____/\\\////\\\_______________\/\\\_____\//\\\___/\\\______\//\\\__! _\//\\\\\\\\\______\/\\\_______\/\\\__/\\\/___\///\\\_____________\/\\\______\//\\\_\///\\\\\\\\\\\/___! __\/////////_______\///________\///__\///_______\///______________\///________\///____\///////////_____ ! ____/\\\\\\\\\______/\\\\\\\\\\\\\\\_____/\\\\\\\\\\\_____/\\\\\\\\\\\\\\\_ ! __/\\\///////\\\___\/\\\///////////____/\\\/////////\\\__\///////\\\/////__ ! _\/\\\_____\/\\\___\/\\\______________\//\\\______\///_________\/\\\_______ ! _\/\\\\\\\\\\\/____\/\\\\\\\\\\\_______\////\\\________________\/\\\_______! _\/\\\//////\\\____\/\\\///////___________\////\\\_____________\/\\\_______! _\/\\\____\//\\\___\/\\\_____________________\////\\\__________\/\\\_______! _\/\\\_____\//\\\__\/\\\______________/\\\______\//\\\_________\/\\\_______! _\/\\\______\//\\\_\/\\\\\\\\\\\\\\\_\///\\\\\\\\\\\/__________\/\\\_______! _\///________\///__\///////////////____\///////////____________\///________! with! 2009-09-15! Andreas Bjärlestam!
  2. Pragmatic explanation   Use HTTP the way it was designed

    to be used   Take advantage of the good things in HTTP   By following a set of constraints
  3. Constraints in REST •  Give everything its own URI • 

    Communicate with a standard set of methods •  Communicate with Media Types •  Link your resources together •  Avoid session state •  Support caching * This is a very simplified version of the real REST constraints, for the real stuff read Roy Fieldings dissertation
  4. @GET, @PUT, @POST @Path("location") public class LocationResouce { @GET @Produces("application/xml")

    public String getLocation() { return "<location>I’m in Sweden</location>"; } }
  5. @PathParam, @QueryParam @Path("location") public class LocationResouce { @GET @Path("{user}") @Produces("application/xml")

    public String getLocation(@PathParam("user") String user) { return "<location>” + user + " is in Sweden</location>"; } }
  6. JAXB @Path("location") public class LocationResouce { @GET @Path("{user}") @Produces("application/xml") public

    Location getLocation(@PathParam("user") String user) { return new Location("59.3", "18"); } }
  7. JAXB @XmlRootElement public class Location { public String lattitude; public

    String longitude; public Date timestamp; . . . }
  8. @Produces and Media Types @Path("location") public class LocationResouce { @GET

    @Path("{user}") @Produces({"application/xml", "application/json"}) public Location getLocation(@PathParam("user") String user) { return new Location("59.3", "18"); } }
  9. @Context, UriInfo and UriBuilder @Path("location") public class LocationResouce { @Context

    UriInfo uriInfo; . . . @POST @Consumes("application/x-www-form-urlencoded") public Response saveLocation(@FormParam("user") String user) { locations.put(user, new Location("59.3", "18")); UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder(); URI userUri = uriBuilder.path(user).build(); return Response.created(userUri).build(); } }
  10. Cache Control @GET @Path("{user}") @Produces({"application/xml", "application/json"}) public Response getLocation(@PathParam("user") String

    user) { Location l = locations.get(user); CacheControl cc = new CacheControl(); cc.setMaxAge(500); Response.ResponseBuilder builder = Response.ok(l); builder.cacheControl(cc); return builder.build(); }
  11. For the interested   Roy Fieldings PhD dissertation, see ch

    5 –  http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm   Roy Fieldings blog –  http://roy.gbiv.com/untangled/   Mark Hadleys blog –  http://weblogs.java.net/blog/mhadley/   Mark Nottinghams blog –  http://www.mnot.net   Stefan Tilkovs blog –  http://www.innoq.com/blog/st/
  12. JAX-RS JSR 311 Version 1.0 was finalized in september 2008

    Version 1.1 is planned to be part of JEE6
  13. Serendipity By giving everything a URL, sticking to a Uniform

    Interface and linking your resources you make the chances of reuse in unexpected ways higher
  14. Statelessness •  Better scaling –  No session storage on server

    –  Any server in a cluster can handle any request –  The resources can safely be cached •  More reliable –  A client can safely re-send a request •  Better resource reuse –  The resources can safely be linked to
  15. Client Proxy Cache Client Client Server Proxy Cache Client Reverse

    Proxy Cache Client Cache Client Cache Client Cache Client Cache
  16. Caching   GET can be cached while POST can't (safely)

      Specify max-age –  Use max-age cache control header   Split data according to freshness requirement   Support conditional GET –  Get if modified since –  E-tags