2012年8月14日 星期二

使用 Tomcat + Jersey 建立 RESTful 服務

用了好一段時間的 RESTful,但還沒有自己從全白的 Linux 架起來過 XD
記錄一下,要用 Jersey 需要以下四個套件:
  • asm-3.1.jar
  • jersey-core-1.1.2-ea.jar
  • jersey-server-1.1.2-ea.jar
  • jsr311-api-1.1.jar
缺少的話 Jersey 會跑不起來,啟動 Tomcat 時就會噴一堆 Exception ~XD


2013-08-25 補充:
Jersey 現在有重新包裝過,以 Jersey 1.17.1 版來說
只需要下載 Jersey 1.17.1 JAR bundle 這一個 JAR 檔,外加 Jersey 1.17.1 ZIP bundle 中的 asm 3.1.jar,就可以架起基本的 RESTful 服務了。

在 Web Project 當中還要設定啟動 Jersey 的設定,才會允許 Jersey 在專案啟動時被讀進去。
在 [ProjectName]/WebContent/WEB-INF/web.xml 裡面新增以下的標籤:
<servlet>
  <servlet-name>ServletAdaptor</servlet-name>
  <servlet-class>com.sun.jersey.server.impl.container.servlet.ServletAdaptor</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>ServletAdaptor</servlet-name>
  <url-pattern>/resource/*</url-pattern>
</servlet-mapping>
其中可以注意上面的 XML 標籤中的
這個標籤是定義如何用網址呼叫 RESTful 服務~例如我指定了一個服務的 Path 是 /login
依照上面的設定,要執行這個 RESTful 服務必須在網址列上輸入 http://[ip]/[project]/resource/login
其中 [ip] 表示伺服器的 IP、[project] 表示網站專案的專案名稱。
如果不想要任何前綴詞,可以直接指定為 /*,例如:

<url-pattern>/*</url-pattern>

而 REST 的程式碼範例如下:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/test")
public class JerseyRest {
  @GET
  @Path("/test")
  @Produces(MediaType.TEXT_PLAIN)
  public String testRest () {
    return "Test OK.";
  }
}
@Path 表示的是這個資源表示的相對路徑,類別上的 Path 和方法上的 Path 會形成階層關係
也就是要存取 testRest() 這個方法時,要使用的 URI 會是 http://[ip]/[project]/resource/test/test。

@GET 表示這個服務是一個 GET 的服務
如果瀏覽器嘗試存取這個 URI,但是使用不是 GET 的 Method,就會獲得 405 Method Not Allow 的回應。
另外值得注意的是,Jersey 不允許同樣 URI 的同樣服務存在,但如果是不同服務就可以同時存在
例如我不能建立兩個同樣是 ../test/test 的 GET 服務,但是可以建立一個 ../test/test 的 GET 加上一個 ../test/test 的 POST 服務。

@Produces 表示這個服務回應的結果,這裡表示回應的是單純的文字
因此在瀏覽器存取這個 URI 時,獲得伺服器回應的標頭中,就會有「Content-Type: text/plain」這樣的內容。

參考資料:
1、[JAVA] 快快樂樂學JAVA RESTful Service using Jersey
2、使用 Jersey + Tomcat 輕鬆開發 RESTful Web Service
3、Jersey Download
4、Java 與 REST 的邂逅,淺談 Jersey 及 JAX-RS(一)

沒有留言: