2014年7月3日木曜日

Jersey で Restful API をつくる

Jersey で Restful な API を作成する。

前提知識として、JAX-RS をさらっと認識しておくと良い。
何故 REST なのか、REST の何がうれしいかを見ておく。

JAX-RS 1 について : http://www.coppermine.jp/docs/programming/2012/12/jaxrs1.html

JAX-RS 2 について : http://www.coppermine.jp/docs/programming/2012/12/jaxrs2.html


JAX-RS 2 を見るにあたっては、CDI も見ておくと良い。

CDI :: https://blogs.oracle.com/nishigaya/entry/javaee6_understanding_cdi_part_1


1 と 2 どちらを用いるかは、作成するアプリケーションの API の複雑性・多様性によって決めると良い。

テキストのみを扱うシンプルな API に JAX-RS 2 の仕様を実装するのもどうかと思う。

Jersey1


ここでは、JAX-RS 1 の実装である、Jersey 1系 を使って、Servlet 環境を作成する。

Jersey 1系の最新 1.18 を以下からダウンロードできる。

https://jersey.java.net/download.html


ダウンロードしたファイルを解凍して、以下を Tomcat プロジェクトのライブラリとして登録する。


  • asm-3.1.jar
  • jersey-client-1.18.jar
  • jersey-core-1.18.jar
  • jersey-json-1.18.jar
  • jersey-server-1.18.jar
  • jersey-servlet-1.19.jar
  • jsr311-api-1.1.1.jar

次に、web.xml を準備する。WEB-INF/web.xml を以下の様に作成する。

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<servlet>
<servlet-name>SC Recognize Your Issue Service</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>jp.masazdream.scryi.server.api</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SC Recognize Your Issue Service</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
</web-app>
view raw web.xml hosted with ❤ by GitHub



servlet タグには、servlet-name と対応する servlet-class を記載する。
これは、jerseyのクラスを設定する。init-paramには、jerseyを使うパッケージを設定する。

ここでは「jp.masazdream.scryi.server.api」である。
load-on-startup で、アプリケーションがコンテナにロードされるときに、初期化するよう設定する。

servlet-mapping では、servlet-name が一致した servlet にアクセスする url-patternを設定する。

ここでは、<アプリケーションコンテキスト名>/api/~ でアクセスする。

~ は、Jerseyによってアノテーションで記述する。

次に、jp.masazdream.scryi.server.api パッケージにクラスを記述する。

@Path("/communication")
public class HelloSCRYServer {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHello() {
String result = null;
LocalTransaction tx = AppConfig.getLocalTransaction();
try {
tx.begin();
MCategoryDao dao = new MCategoryDaoImpl();
MCategory mcategory = dao.selectById(1);
result = mcategory.getCategoryCode();
tx.commit();
} finally {
// トランザクション
tx.rollback();
}
return result;
}
}


アノテーション「@Path」に続けて書いたのが、~部分である。
また、Doma を使った DAO 部分の記述をテストとして記述しているが、適当な文字列を返すほうがはじめの一歩の検証に良いだろう。


アプリケーションコンテキスト名は、Eclipse で作成したプロジェクトの場合、通常プロジェクト名がデフォルトで設定されるが、以下の手順で変更が可能である。

[プロジェクトプロパティ]-[Tomcat]-[全般タブ]-コンテキスト名

である。例えば、「test」と設定したとする。


Tomcatプロジェクト全般の設定については、以下が参考になる。

http://seesaawiki.jp/salyu/d/Eclipse%A4%CB%A4%AA%A4%B1%A4%EBTomcat%A4%CE%C0%DF%C4%EA

以上で、以下のURLからAPIをたたくことが可能である。

http://localhost:8080/test/api/communication



0 件のコメント:

コメントを投稿