+++ title = "rest" draft = false tags = [ "code", "java", "rest" ] date = "2013-05-22" +++ # Rest Calls plegen met Java ## Jersey :exclamation: **User Guide**: http://jersey.java.net/nonav/documentation/latest/user-guide.html ### Server ##### maven ```xml com.sun.jersey jersey-server 1.17 com.sun.jersey jersey-json 1.17 com.sun.jersey jersey-servlet 1.17 ``` `jersey-json` is niet nodig als je geen `JSON` wil gebruiken. `jersey-servlet` ook niet als je geen Servlet 2.x gebruikt. ##### servlet 2.x config Dit moet in `web.xml`: ```xml jersey-serlvet com.sun.jersey.spi.container.servlet.ServletContainer com.sun.jersey.config.property.packages be.klak.package com.sun.jersey.api.json.POJOMappingFeature true 1 jersey-serlvet /rest/* ``` :exclamation: Om Jersey samen met google app engine te kunnen gebruiken, moet je ook dit nog toevoegen: ```xml com.sun.jersey.config.feature.DisableWADL true ``` Zie http://stackoverflow.com/questions/14305035/jersey-setup-on-app-engine ##### voorbeeld ```java @Path("/gc") public class Controller { @GET @Path("/path") @Produces(APPLICATION_JSON) public List getStuff() { return stuffRepo().getAll(); } @POST @Consumes(MediaType.TEXT_PLAIN) @Path("/bla/receive") public Response received(String data) { return ok().build(); } ``` waarbij `ok()` op `javax.ws.rs.Response` zit. ### Client ##### maven ```xml com.sun.jersey jersey-client 1.17 ``` ##### voorbeeld `com.sun.jersey.api.client.Client` client: ```java Client.create() .resource(getGatecontrolServer() + "/rest/gc/houses/receive") .type(TEXT_PLAIN) .post("request body data"); ``` ### Header control (bvb caching) Kan via een filter factory die je meegeeft aan de init params van de servlet in web.xml: ```xml com.sun.jersey.spi.container.ResourceFilters be.klak.rest.CacheFilterFactory ```java public class CacheFilterFactory implements ResourceFilterFactory { @Override public List create(AbstractMethod am) { if (hasNoCacheAnnotationOnClass(am) != null) { return Collections. singletonList(new CacheResponseFilter()); } return new ArrayList<>(); } private CacheControlHeaderNoCache hasNoCacheAnnotationOnClass(AbstractMethod am) { return am.getResource().getResourceClass().getAnnotation(CacheControlHeaderNoCache.class); } private static class CacheResponseFilter implements ResourceFilter, ContainerResponseFilter { @Override public ContainerRequestFilter getRequestFilter() { return null; } @Override public ContainerResponseFilter getResponseFilter() { return this; } @Override public ContainerResponse filter(ContainerRequest request, ContainerResponse response) { response.getHttpHeaders().putSingle(HttpHeaders.CACHE_CONTROL, "no-cache"); return response; } } } ``` Annotatie ziet er zo uit: ```java @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.METHOD }) public @interface CacheControlHeaderNoCache { } ``` Vanaf dan kan je die gewoon op een resource klasse plakken, zoals `@Produces` en `@Consumes`.