使用 Apache Wink 創建 RESTfull 服務
本文將介紹 Apache Wink,一種用于構造 Representational State Transfer (REST)ful Web 服務的框架。Apache Wink 是一個 Apache Incubator 項目。它的目標是通過提供使用 Java ; 注釋在類的內部定義服務的能力,提供一種簡單的編寫 RESTful Web 服務的方法。
REST
與 SOAP 不同,RESTful Web 服務并不一定需要 XML 文檔作為消息載體。并沒有標準的 XML Schema Definition(XSD) 描述消息格式。這使得 RESTful Web 服務可以像訪問 URL 時返回的文檔一樣簡單。實際上,Web 頁面確實符合 RESTful Web 服務的配置文件。
由于消息格式并不需要使用 XML,因此幾乎支持所有類型的消息內容。例如,可以將普通文本提交給 URL 以對一個 RESTful Web 服務調用 POST 方法。也可以使用其他簡單消息格式,例如 JSON。Apache Wink 能夠匹配 HTTP 操作中識別的 MIME 類型和使用并提供給定 MIME 類型的服務方法。
RESTful Web 服務使用不同的 HTTP 操作來公開服務,而這些服務執行不同的操作。盡管本身沒有確定的標準,但有些原則定義了對特定的任務使用哪些 HTTP 操作。請看表 1。
表 1. REST 操作和 URL 示例
HTTP 操作 | URL 樣例 | 用途 |
GET | http://localhost:8080/Task/rest/tasks | 列舉出服務搜索到的所有任務 |
GET | http://localhost:8080/Task/rest/tasks/1 | 獲得 ID 為 1 的任務 |
POST | http://localhost:8080/Task/rest/tsks | 根據提交的數據創建一個新任務 |
PUT | http://localhost:8080/Task/rest/tasks/1 | 使用數據請求更新 ID 為 1 的指定任務 |
DELETE | http://localhost:8080/Task/rest/tasks/1 | 刪除 ID 為 1 的任務 |
wink需要的jar包:
wink-1.0-incubating.jar
wink-common-1.0-incubating.jar
wink-server-1.0-incubating.jar
導入 Apache Wink 庫以后,從二進制版本的 lib 文件夾中導入以下依賴項:
activation-1.1.jar
commons-lang-2.3.jar
jaxb-api-2.1.jar
jaxb-impl-2.1.4.jar
jsr311-api-1.0.jar
slf4j-api-1.5.8.jar
slf4j-simple-1.5.8.jar
stax-api-1.0-2.jar
清單 1. web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Tasks</display-name>
<description>REST services for managing tasks.</description>
<servlet>
<servlet-name>restService</servlet-name>
<servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class>
<init-param>
<param-name>applicationConfigLocation</param-name>
<param-value>/WEB-INF/resources</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>restService</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
清單 2. WEB-INF/resources文件內容:
# Beans for REST Services
com.abc.ABCResource
com.abc.TasksResource
清單 3. 不具備實現的 TasksResource
類
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.wink.server.utils.LinkBuilders;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@Path("tasks")
public class TasksResource {
private static final String TASK = "tasks";
private static final String ITEM_PATH = "{tasks}";
private static final String ENCODING = "UTF-8";
@GET
@Produces( { MediaType.APPLICATION_JSON })
public JSONArray getTasks() {
// TODO: Add implementation
return null;
}
@Path(ITEM_PATH)
@GET
@Produces( { MediaType.APPLICATION_JSON })
public JSONObject getTask(@Context LinkBuilders link, @Context UriInfo uri,
@PathParam(TASK) String taskId) {
// TODO: Add implementation
return null;
}
@POST
@Consumes( { MediaType.APPLICATION_FORM_URLENCODED })
@Produces( { MediaType.APPLICATION_JSON })
public JSONObject createTask(MultivaluedMap<String, String> formData,
@Context UriInfo uriInfo, @Context LinkBuilders linksBuilders) {
// TODO: Add implementation
return null;
}
@Path(ITEM_PATH)
@PUT
@Consumes( { MediaType.APPLICATION_JSON })
@Produces( { MediaType.APPLICATION_JSON })
public JSONObject updateTask(JSONObject task, @Context UriInfo uriInfo,
@Context LinkBuilders linksBuilders) {
// TODO: Add implementation
return null;
}
@Path(ITEM_PATH)
@DELETE
@Produces( { MediaType.APPLICATION_JSON })
public JSONObject deleteTask(@Context LinkBuilders link, @Context UriInfo uri,
@PathParam(TASK) String taskId) {
// TODO: Add implementation
return null;
}
}
部署完成后,輸入http://localhost:8080/Tasks/rest/tasks/1就可以測試了。