天天看點

Build RESTful web service using Jersey

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());
    }

}