Build RESTful web service using Jersey
[b]Server side[/b]
-----------------------------------------------------------
1) Dependencies:
jsr311.jar
jersey-core.jar
jersey-server.jar
asm.jar
2) web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>HelloWorldApp</display-name>
<servlet>
<servlet-name>CMDA REST Web Services</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.zero.ws.rest.resources</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- /resources/* or /* -->
<servlet-mapping>
<servlet-name>CMDA REST Web Services</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
3) ExchangeResource.java
import static com.zero.ws.rest.util.BaseUtils.deserializeDataObject;
import static com.zero.ws.rest.util.BaseUtils.serializeDataObject;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import com.zero.ws.rest.domain.Exchange;
@Path("/exchange")
@Produces( { "application/xml" })
public class ExchangeResource {
@Context
UriInfo uriInfo;
@Context
Request request;
//application/octet-stream
String type = MediaType.APPLICATION_OCTET_STREAM;
@GET
@Path("/key/{exchCode}")
public Response getExchangeByKey(@PathParam("exchCode") String exchCode) {
if ((exchCode != null) && (exchCode.length() > 0)) {
Exchange exch = new Exchange();
exch.setName("Hello");
if (exch != null) {
byte[] buf = serializeDataObject(exch);
if ((buf != null) && (buf.length > 0)) {
return Response.ok(buf, "application/octet-stream").build();
}
}
}
return Response.noContent().build();
}
//By default, has a parameter byte[], don't need define @PathParam
//Can ignore it if don't declare this method parameter
@POST
@Path("/query/{exchCode}/{exchName}")
public Response query(byte[] data, @PathParam("exchCode") String exchCode, @PathParam("exchName") String exchName) {
Exchange exch = new Exchange();
exch.setExchCode(exchCode);
exch.setName(exchName);
System.out.println("Query: " + exchCode + ", " + exchName);
Exchange exch2 = (Exchange) deserializeDataObject(data, Exchange.class);
System.out.println("Orginal Exchange: " + exch2.getExchCode() + ", " + exch2.getName());
byte[] result = serializeDataObject(exch);
//Exchange exch2 = (Exchange) deserializeDataObject(data, Exchange.class);
//System.out.println("query: " + exch2.getExchCode() + ", " + exch2.getName());
return Response.ok(result, "application/octet-stream").build();
}
@POST
@Path("/create")
public Response createExchange(byte[] data) {
Exchange exch = (Exchange) deserializeDataObject(data, Exchange.class);
System.out.println("CREATE: " + exch.getExchCode());
return Response.ok(data, "application/octet-stream").build();
}
@POST
@Path("/get")
public Response getExchange(byte[] data) {
Exchange exch = (Exchange) deserializeDataObject(data, Exchange.class);
System.out.println("CREATE: " + exch.getExchCode());
return Response.ok(data, "application/octet-stream").build();
}
@POST
@Path("/update")
public Response updateExchange(byte[] data) {
Exchange exch = (Exchange) deserializeDataObject(data, Exchange.class);
System.out.println("UPDATE: " + exch.getExchCode());
return Response.ok(data, "application/octet-stream").build();
}
@POST
@Path("/delete")
public Response deleteExchange(@PathParam("exchange") String exchange) {
System.out.println("DELETE: " + exchange);
return Response.ok().build();
}
}
4) Deploy to Jetty
Dependencies:
geronimo-servlet_2.5_spec-1.2.jar
jetty-6.1.18.jar
jetty-util-6.1.18.jar
slf4j-api-1.5.6.jar
slf4j-jdk14-1.5.6.jar
/**
* Starts up a servlet container(Jetty) and adds the web application in web directory to it.
*
*
* @author louis
*/
public class Server {
private int port = 8088;
private String webDir = "web";
private String contextPath = "/RestHelloWorld";
protected Server() throws Exception {
System.out.println("Starting Server");
org.mortbay.jetty.Server server = new org.mortbay.jetty.Server();
//1) Set Connector
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(port);
server.setConnectors(new Connector[] {connector});
//2) Set Context Path
WebAppContext webappcontext = new WebAppContext();
webappcontext.setContextPath(contextPath);
//3) Set War
webappcontext.setWar(webDir);
//4) Set handler
HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[] {webappcontext, new DefaultHandler()});
server.setHandler(handlers);
//5) Start
server.start();
System.out.println("Server ready...");
server.join();
}
public static void main(String args[]) throws Exception {
new Server();
}
}
[b]Client side[/b]
-----------------------------------------------------------
1) Dependencies:
jsr311.jar
jersey-core.jar
jersey-server.jar
2) Test
import static com.zero.ws.rest.util.BaseUtils.deserializeDataObject;
import static com.zero.ws.rest.util.BaseUtils.serializeDataObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.zero.ws.rest.domain.Exchange;
public class TestExchange {
static String baseURL = "http://localhost:8088/RestHelloWorld/exchange";
public static void main(String[] args) {
new TestExchange().run();
Client client = Client.create();
WebResource webResource = null;
ClientResponse response = null;
// Query -> POST
webResource = client.resource(baseURL + "/query/002/Ellen");
Exchange newExchange = new Exchange();
newExchange.setExchCode("001");
newExchange.setName("New York");
byte[] data = serializeDataObject(newExchange);
response = webResource.post(ClientResponse.class, data);
System.out.println("Query response: " + response.getStatus());
byte[] byteArray = response.getEntity(byte[].class);
Exchange exch = deserializeDataObject(byteArray, Exchange.class);
System.out.println("query Exchange: " + exch.getExchCode() + ", " + exch.getName());
}
void run() {
Client client = Client.create();
WebResource webResource = null;
ClientResponse response = null;
// Read -> GET
webResource = client.resource(baseURL + "/key/ABC123");
response = webResource.get(ClientResponse.class);
byte[] byteArray = response.getEntity(byte[].class);
Exchange exch = deserializeDataObject(byteArray, Exchange.class);
System.out.println("Exchange name: " + exch.getName());
Exchange newExchange = new Exchange();
newExchange.setExchCode("NYSE");
newExchange.setName("New York Stock Exchange");
newExchange.setDescription("New York Stock Exchange 1");
byte[] newExchBin = serializeDataObject(newExchange);
// Create -> POST
webResource = client.resource(baseURL + "/create");
response = webResource.post(ClientResponse.class, newExchBin);
System.out.println("Create response: " + response.getStatus());
byteArray = response.getEntity(byte[].class);
exch = deserializeDataObject(byteArray, Exchange.class);
System.out.println("Create Exchange name: " + exch.getName());
// Read -> POST
webResource = client.resource(baseURL + "/get");
response = webResource.post(ClientResponse.class, newExchBin);
System.out.println("Read response: " + response.getStatus());
byteArray = response.getEntity(byte[].class);
exch = deserializeDataObject(byteArray, Exchange.class);
System.out.println("Read Exchange name: " + exch.getName());
// Update -> POST
webResource = client.resource(baseURL + "/update");
response = webResource.post(ClientResponse.class, newExchBin);
System.out.println("Update response: " + response.getStatus());
byteArray = response.getEntity(byte[].class);
exch = deserializeDataObject(byteArray, Exchange.class);
System.out.println("Update Exchange name: " + exch.getName());
// Delete -> POST
webResource = client.resource(baseURL + "/delete");
response = webResource.post(ClientResponse.class, newExchBin);
System.out.println("Delete response: " + response.getStatus());
}
}