使用 Apache Wink 創建 RESTfull 服務

jopen 10年前發布 | 22K 次閱讀 RESTfull WEB服務/RPC/SOA

本文將介紹 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就可以測試了。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!