Build RESTful web service using Jersey

本文介绍如何使用Java和Jersey框架构建RESTful Web服务。包括服务端配置与实现细节,如依赖设置、web.xml配置文件说明及资源类编写等。同时提供了客户端测试示例代码,展示如何进行读取、创建、更新和删除操作。
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());
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值