Firefox OS Advent Calendar 2014

12月17日 Web API を作ってみる

Firefox OSと直接の関係性が薄い記事ですが、Webアプリケーション開発関連として、御了承下さい。

パッケージ型の Firefox OS アプリを作ってたとしましても、サーバサイドでの独自のWeb APIが必要になることがありますよね。
そこで、簡単な例としてGETメソッド・リクエストで名前を受け取り挨拶を返してくれる「あいさつ」Web APIを作ってみます。

【お詫び】
私のPC環境は、Ubuntu 14.04 LTS 64bit ですので、サンプル内容も Linux 用になっています。
他の環境の方、ごめんなさい。


JavaでサクッとWeb API作成

Javaには、RESTful なシステム機能を提供する JAX-RS という規格(パッケージ/ライブラリ)があります。
JAX-RS が提供する機能を利用すると、単なるPOJOのクラスとメソッドで、特定のパスからのGETやPOSTやパラメータを受け取り、 返り値として任意のリソースを返すことができるようになります。

名前を受け取って挨拶を返すサンプル

1
2
3
4
5
6
7
8
9
@Path("/resource")
public class SampleResource {
    @Path("/greet")
    @GET
    @Produces(MediaType.TEXT_PLAIN + "; charset=UTF-8")
    public String getGreet(@QueryParam("name") String name) {
        return "こんにちは、" + name + "さん。";
    }
}

上記が、URIパターン "/resource/greet?name=山田" でアクセスすると、こんにちは、山田さん。を返すWeb APIの全実装です。
今どきのWeb開発では当たり前の実装量ですね。

昔の実装...
1
2
3
4
5
6
7
8
9
10
11
12
public class GreetServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, 
        HttpServletResponse response) throws ServletException, IOException {
        if ("/resource/greet".equals(request.getServletPath()) {
            request.ssetContextType("text/plain; chrset=UTF-8"):
            String name  = request.getParameter("name");
            String greet = "こんにちは、" + name + "さん。";
            PrintWriter out = response.getWriter();
            out.print(greet);
        }
    }
}


実際に作ってみる

JAX-RSは、規格なので利用するには実装が必要です。
JAX-RSの実装には、Apache CXFJerseyRESTEasyなどがあるそうですが、 今回は、参照実装である Jersey を利用します。


準備するもの

Java開発環境(JDK)
最新版であるJDK8を利用します。

Maven3
Maven は、依存管理(RubyGemsのようなリポジトリからのライブラリ取得)やビルド支援を行ってくれる構成管理ツールです。
詳しくは、以下を参照ください。

サーブレットコンテナ
作成した Web API をデプロイして、ローカルでの動作確認に利用します。
よく知られたサーバ(サーブレットコンテナ)として、Apache Tomcat と Jetty があります。
現在ローカルのサーブレットコンテナをインストールしていない場合は、いずれかをインストールしてください。
JAX-RS実装 (Jersey)
JAX-RS は規格ですので、ライブラリとして参照実装であるJerseyを利用します。

インストールと設定

Java 開発環境(JDK)の入手と手動インストール
最新版であるJDK8を利用します。

ダウンロード
Java SE - Downloadsから、ご自身のPC環境にあったJDKをダウンロードします。
私は、Java SE 8u25 の JDK (Linux x64 jdk-8u25-linux-x64.tar.gz)をダウンロードしました。

補足
Javaのバージョンは、1.7(JDK7)以上であれば構いません。
開発環境(IDE)も必要な場合は、同ページの下段にある JDK 8 with NetBeans をダウンロードしても良いと思います。

インストール&設定

    JDKのみの場合
  1. ダウンロードした圧縮ファイルを任意のディレクトリに展開
  2. JAVA_HOME 環境変数を新規作成し、インストール場所を設定して、コマンドバイナリの場所として $JAVA_HOME/bin を 環境変数PATHに追加します。
    1
    2
    
    export JAVA_HOME=(展開先のディレクトリ)
    export PATH=$PATH:$JAVA_HOME/bin
    

    JDK + NetBeans の場合
  1. Linux 64ビット版の場合は、ダウンロードしたファイルに実行権限を付与して実行します。
    あとは、インストーラの指示に従ってインストールしてください。
    1
    2
    
    $ chmod a+x jdk-8u25-nb-8_0_2-linux-x64.sh
    $ ./jdk-8u25-nb-8_0_2-linux-x64.sh
    

  2. JDKのみと同じように、JAVA_HOME 環境変数の設定も行ってください。

Maven 3の入手と手動インストール

ダウンロード
MavenサイトのDownload Apache Maven 3.2.3から、ご自身のPC環境にあったファイルをダウンロードします。
私は、Maven 3.2.3 (Binary zip) Linux版 apache-maven-3.2.3-bin.zip (8MB)をダウンロードしました。

インストール&設定
  1. ダウンロードした圧縮ファイルを任意のディレクトリに展開。
  2. M2_HOME などの環境変数を新規作成し、インストール場所を設定して、コマンドバイナリの場所として $M2_HOME/bin を 環境変数PATHに追加します。
  3. オプションとして、JVMオプション MAVEN_OPTS="-Xms256m -Xmx512m" を追加しても可。
    1
    2
    3
    
    export M2_HOME=(展開先のディレクトリ)
    export PATH=$PATH:$M2_HOME/bin
    export MAVEN_OPTS="-Xms256m -Xmx512m" ← オプション
    

  4. JDKのみと同じように、JAVA_HOME 環境変数の設定も行ってください。
    補足
  1. mvn --version コマンドで、Mavenのバージョンが表示されればインストール完了です。
    1
    2
    3
    4
    5
    6
    7
    8
    
    $ mvn --version
    Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-12T05:58:
    10+09:00)
    Maven home: /home/rie/bin/apach-maven/apache-maven-3.2.3
    Java version: 1.8.0_25, vendor: Oracle Corporation
    Java home: /home/rie/bin/java/jdk1.8.0_25/jre
    Default locale: ja_JP, platform encoding: UTF-8
    OS name: "linux", version: "3.13.0-43-generic", arch: "amd64", family: "unix"
    

  2. Ubuntuの場合は、パッケージインストールもできます。
    1
    2
    
    sudo apt-get update
    sudo apt-get install maven
    


ローカル・サーバ (サーブレットコンテナ)

Tomcat のダウンロードと手動インストール

ダウンロード
Apache TomcatサイトのTomcat 8 Downloadsページから、ご自身のPC環境にあったファイルをダウンロードします。
私は、tar.gz(apache-tomcat-8.0.15.tar.gz 9.2MB)をダウンロードしました。

インストール&設定
  1. 基本的にダウンロードした圧縮ファイルを任意のディレクトリに展開。
  2. CATALINA_HOME とCATALINA_BASE環境変数を新規作成し、インストール場所を設定して、 コマンドバイナリの場所として $CATARINA_HOME/bin を 環境変数PATHに追加します。
    1
    2
    3
    
    export CATALINA_HOME=(Tomcatを展開したディレクトリ)
    export CATALINA_BASE=$CATALINA_HOME
    export PATH=$PATH:$CATARINA_HOME/bin
    

  3. インストール詳細は、Tomcat Setupページを参照ください。
    補足
  1. Tomcatの起動と終了コマンド
    1
    2
    
    $ startup.sh  ← バックグラウンド起動コマンド
    $ shutdown.sh ← バックグラウンド停止コマンド
    

Jettyのダウンロードと手動インストール

ダウンロード
JettyサイトのDownloads > Jetty Downloadsページから,最新のリリース版ファイルをダウンロードします。
私は、9.2.6.v20141205 の .zip (jetty-distribution-9.2.6.v20141205.zip 13.5MB)をダウンロードしました。

インストール&設定
  1. ダウンロードした圧縮ファイルを任意のディレクトリに展開。
  2. JETTY_HOME などの環境変数を新規作成し、インストール場所を設定して、 コマンドバイナリの場所として $JETTY_HOME/bin を 環境変数PATHに追加します。
    1
    2
    
    export JETTY_HOME=(JETTYを展開したディレクトリ)
    export PATH=$PATH:$JETTY_HOME/bin
    

  3. インストールなどの詳細は、Jetty - Documentationページを参照ください。
    補足
  1. jettyの起動と終了コマンド
    1
    2
    3
    
    $ jetty.sh start ← バックグラウンド起動コマンド
    $ jetty.sh stop  ← バックグラウンド停止コマンド
    $ java -jar $JETTY_HOME/start.jar ←フォアグラウンド起動 (終了は、Ctrl-C)
    

JAX-RS 実装(Jersey)の入手とインストール
ダウンロード&インストール
DownloadページのJersey JAX-RS 2.0 RI bundleリンクからjaxrs-ri-2.14.zipを直接ダウンロードできますが、今回は、Mavenを使う(プロジェクト・ビルド時にMavenリポジトリからの自動ダウンロード&インポートを行う)ので、特にダウンロード&インストールを行いません。

もしも手動でビルドを行う場合は、以下の手順で、ビルドが通るよう Jersey のクラスをライブラリに手動追加してください。
  1. はじめに、上記の zip ファイルをダウンロードして展開します。
  2. 次に作成するアプリのライブラリ・ディレクトリに、展開されたディレクトリ中の api、ext、libディレクトリをコピーします。

WebAPIプロジェクトの生成とソース・ファイルの作成

Maven3で、Webアプリケーション・プロジェクトのひな形を作成して、Web API作成に必要な、設定ファイルとソースを作成します。

  1. 挨拶WebAPIプロジェクトを作成するディレクトリへ移動
    挨拶WebAPIプロジェクトを生成するディレクトリに移動します。
    例:ホームディレクトリにプロジェクト保管用として my_projects ディレクトリを作る場合
    1
    2
    3
    
    $ ~/
    $ mkdir my_projects
    $ cd my_projects
    

  2. プロジェクトのひな形作成
    MavenコマンドでWebアプリケーション・プロジェクトのひな形を作成します。
    1
    
    $ mvn archetype:generate -DgroupId=com.example.webapi.greet 
                             -DartifactId=greet-webapi 
                             -DarchetypeArtifactId=maven-archetype-webapp
    

    実際は、1行のコマンドです。
    groupIdはアプリのパッケージ名、artifactIdはアプリ名、archetypeArtifactIdがMavenのwebアプリを表すIDです。

    注意
    コマンドを実行するとコンソールに、ひな形作成のログが出力されます。
    自分固有のパッケージ名にしたい場合は、groupIdの値を変更してください。
    途中でアプリの package名や version 指定を確認されますので、そのままで良ければ Enter を押してください。
    (versionのデフォルト値は、1.0-SNAPSHOT になります)

    参考資料
    Mavenアーキタイプ (2012/07/14)

  3. プロジェクトのひな形ディレクトリ構成の確認
    プロジェクトのひな形生成に成功すると、artifactId で指定した名前のプロジェクト・ディレクトリが作成されます。

    上記の例で生成されたプロジェクト・ディレクトリの構成
    my_projects/
               +greet-webapi/
                            +src/
                            |   +main/
                            |        +webapp/
                            |        |      +WEB-INF/
                            |        |      |       +web.xml
                            |        |      |
                            |        |      +index.jsp
                            |        |
                            |        +resource/
                            |
                            |
                            +pom.xml
    

  4. pom.xml の設定
    プロジェクトのひな形で生成されたファイル内容に追加設定を行います。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=
      "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.example.webapi.greet</groupId>
      <artifactId>greet-webapi</artifactId>
      <packaging>war</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>greet-webapi Maven Webapp</name>
      <url>http://maven.apache.org</url>
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
    <!-- 追加設定>>>>> -->
        <!-- JAX-RS非対応のサーブレットコンテナ用の Jersey パッケージ -->
        <dependency>
          <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <version>2.14</version>
        </dependency>
        <!-- JAXB (XMLとJSONの取り扱い対応) パッケージ -->
        <dependency>
    	    <groupId>org.glassfish.jersey.media</groupId>
    	    <artifactId>jersey-media-json-jackson</artifactId>
    	    <version>2.14</version>
        </dependency>
    <!-- <<<<<追加設定 -->
      </dependencies>
      <build>
        <finalName>greet-webapi</finalName>
    <!-- 追加設定>>>>> -->
        <plugins>
          <!-- Maven コンパイラ(ビルド)プラグイン -->
          <plugin>
    	    <groupId>org.apache.maven.plugins</groupId>
    	    <artifactId>maven-compiler-plugin</artifactId>
    	    <version>3.2</version>
            <configuration>
              <source>1.7</source>
              <target>1.7</target>
            </configuration>
          </plugin>
        </plugins>
    <!-- <<<<<追加設定 -->
      </build>
    </project>
    

    参考先
    Chapter 2. Modules and dependencies
    Maven Repository: Search/Browse/Explore
    The Central Repository Search Engine

  5. web.xml の設定
    プロジェクトのひな形で生成されたファイル内容に追加設定を行います。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
    <!-- 追加設定>>>>> -->
        <servlet>
          <servlet-name>Greet Web API</servlet-name>
          <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
          <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.example.webapi.greet</param-value>
          </init-param>
        </servlet>
      <servlet-mapping>
        <servlet-name>Greet Web API</servlet-name>
        <url-pattern>/*</url-pattern>
      </servlet-mapping>
    <!-- 追加設定>>>>> -->
    </web-app>
    

    参考先
    Chapter 4. Application Deployment and Runtime Environments

  6. ソース・ファイルの作成
    mainディレクトリ直下に、javaディレクトリを作成して、パッケージ構成と同じサブ・ディレクトリを作ってから、以下のJavaソース・ファイルを作成してください。

    greet-webapi/src/main/java/com/example/webapi/greet/SampleResource.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    package com.example.webapi.greet;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.QueryParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
     
    @Path("/resource")
    public class SampleResource {
        @Path("/greet")
        @GET
        @Produces(MediaType.TEXT_PLAIN + "; charset=UTF-8")
        public String getGreet(@QueryParam("name") String name) {
            return "こんにちは、" + name + "さん。";
        }
    }
    

  7. ビルド
    greet-webapi ディレクトリで、以下のMavenコマンドを実行します。
    1
    2
    
    $ mvn clean    ← クラスファイルなどのビルド生成物の全消去
    $ mvn package  ← ビルドからwarファイル作成までのゴール指定
    

    上記を実行すると、コンソールに以下のようなログが出力されてビルドが進行します。

    BUILD SUCCESS と出力されれば、ビルドの完了です。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    [INFO] Scanning for projects...
    [INFO]                                                                         
    [INFO] ------------------------------------------------------------------------
    [INFO] Building greet-webapi Maven Webapp 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    Downloading: https://repo.maven.apache.org/maven2/org/glassfish/jersey/containe
    rs/jersey-container-servlet-core/2.14/jersey-container-servlet-core-2.14.pom
    Downloaded: https://repo.maven.apache.org/maven2/org/glassfish/jersey/container
    s/jersey-container-servlet-core/2.14/jersey-container-servlet-core-2.14.pom (5 
    KB at 0.7 KB/sec)
    〜 省略 〜
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 19.972 s
    [INFO] Finished at: 2014-12-15T00:59:47+09:00
    [INFO] Final Memory: 16M/122M
    [INFO] ------------------------------------------------------------------------
    


    以下のように BUILD FAILURE と出力され[ERROR] で終了した場合は、ログからエラー箇所の修正をして再ビルドを行ってください。

    エラー終了出力例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    〜 省略 〜
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 39.286 s
    [INFO] Finished at: 2014-12-15T00:54:32+09:00
    [INFO] Final Memory: 12M/140M
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3
    .2:compile (default-compile) on project greet-webapi: Compilation failure
    [ERROR] /home/rie/Share/web_api/my_projects/greet-webapi/src/main/java/com/exam
    ple/webapi/greet/GreetService.java:[5,34] ';'がありません
    [ERROR] -> [Help 1]
    [ERROR] 
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e swi
    tch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR] 
    [ERROR] For more information about the errors and possible solutions, please re
    ad the following articles:
    [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureEx
    ception
    

  8. ビルド成果物の確認
    ビルドに成功すると、プロジェクト・ディレクトリの直下にtargetディレクトリが作成されます。
    targetディレクトリ内には、クラスや warファイル(*1)などのビルド結果物が配置されます。
    (*1)Webアプリケーションのプログラムやライブラリと設定ファイル一式が圧縮されたファイル。
     このサンプルでは、プロジェクト名からgreet-webapi.warが作成されます。

    当該例でのビルド結果のディレクトリ構成
    my_projects/
               +greet-webapi/
                            +src/
                            |   +main/
                            |        +webapp/
                            |        |      +WEB-INF/
                            |        |      |       +web.xml
                            |        |      |
                            |        |      +index.jsp
                            |        |
                            |        +resource/
                            |
                            +target/
                            |      +classes/
                            |      |       +...詳細省略
                            |      |
                            |      +maven-status/
                            |      |            +...詳細省略
                            |      |
                            |      +maven-archiver/
                            |      |              +...詳細省略
                            |      |
                            |      +generated-sources/
                            |      |                 +...詳細省略
                            |      |
                            |      +greet-webapp/
                            |      |            +...詳細省略
                            |      |
                            |      +greet-webapi.war
                            |
                            +pom.xml
    

  9. Web APIアプリケーションのデプロイと起動
    Web APIアプリケーションが出来上がったので、ローカル・サーバ(サーブレット・コンテナ)にデプロイしましょう。

    Tomcat への手動デプロイとサーバ起動
    Tomcat を展開したディレクトリ($CATALINA_HOME)の直下にあるwebappsディレクトリにgreet-webapi.warをコピーすれば、サーバが起動中であれば、自動的にWeb APIアプリケーションが反映されます。
    サーバが起動していない場合は、ターミナルでTomcat起動コマンド(startup.sh)を実行してください。

    Jetty への手動デプロイとサーバ起動
    Jetty を展開したディレクトリ($JETTY_HOME)の直下にあるwebappsディレクトリにgreet-webapi.warをコピーすれば、サーバが起動中であれば、自動的にWeb APIアプリケーションが反映されます。
    サーバが起動していない場合は、ターミナルでJetty起動コマンド(jetty.sh start)か、java -jar $JETTY_HOME/start.jar を実行してください。

  10. あいさつ Web API の実行
    ブラウザのURLバーに http://localhost:8080/greet-webapi/resource/greet?name=山田 と入力(*1)すると、 ブラウザに こんにちは、山田さん。 と表示されます。


    あいさつWeb API実行結果

    (*1)実際は、下記のようなURLエンコードが行なわれます。
     http://localhost:8080/greet-webapi/resource/greet?name=%E5%B1%B1%E7%94%B0


空耳

Web API ...って、TEXT出力しているだけだろ! というDISりまくる声が聞こえてきたような...
ということで、急遽 SampleResource.java ソース+アルファで、品名と値段のリストをJSONXML形式で返す Web API を追加してみます。

やることとしては、SampleResource.java に、JSONとXML形式出力のWeb APIメソッドを追加し、品名と値段を保管するモデル・クラスを2つ(JSONとXML分)追加するだけですけれど。

    補足
  • JSONとXML形式の出力には、JAXBという規格を利用しています。
  • JAXB実装は、pom.xml のJAXB パッケージ の依存設定によりJacksonを利用しています。

Web API実装部ソース
greet-webapi/src/main/java/com/example/webapi/greet/SampleResource.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
50
41
42
43
44
45
46
47
48
49
50
51
package com.example.webapi.greet;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.core.MediaType;
import java.util.List;
import java.util.ArrayList;
 
@Path("/resource")
public class SampleResource {
    @Path("/greet")
    @GET
    @Produces(MediaType.TEXT_PLAIN + "; charset=UTF-8")
    public String getGreet(@QueryParam("name") String name) {
        return "こんにちは、" + name + "さん。";
    }

    @Path("/receipt-json")
    @GET
    @Produces({MediaType.APPLICATION_JSON + "; charset=UTF-8"})
    public List<ItemJsonBean> getItemJson() {
        List<ItemJsonBean> items = new ArrayList<ItemJsonBean>();
        ItemJsonBean item = new ItemJsonBean();
        item.name = "お茶(ペットボトル)";
        item.price = 140;
        items.add(item);
        item = new ItemJsonBean();
        item.name = "紅茶(ペットボトル)";
        item.price = 150;
        items.add(item);
        return items;
    }

    @Path("/receipt-xml")
    @GET
    @Produces({MediaType.APPLICATION_XML})
    public List<ItemXmlBean> getItemXml() {
        List<ItemXmlBean> items = new ArrayList<ItemXmlBean>();
        ItemXmlBean item = new ItemXmlBean();
        item.name = "コーラ(缶)";
        item.price = 120;
        items.add(item);
        item = new ItemXmlBean();
        item.name = "サイダー(缶)";
        item.price = 100;
        items.add(item);
        return items;
    }
}


JSON形式用モデル・ソース
greet-webapi/src/main/java/com/example/webapi/greet/ItemJsonBean.java
1
2
3
4
5
6
package com.example.webapi.greet;

public class ItemJsonBean {
    public String name;
    public int    price;
}


XML形式用モデル・ソース
greet-webapi/src/main/java/com/example/webapi/greet/ItemXmlBean.java
1
2
3
4
5
6
7
8
package com.example.webapi.greet;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class ItemXmlBean {
    public String name;
    public int    price;
}


ビルドからデプロイまで
ビルドからデプロイ+動作確認は、前記の手順と同じです。


追加 Web API の動作確認
ブラウザで、http://localhost:8080/greet-webapi/resource/receipt-jsonをアクセスすると, 以下のように JSON 形式のデータが表示されます。
[{"name":"お茶(ペットボトル)","price":140},{"name":"紅茶(ペットボトル)","price":150}]


JSON取得実行結果


ブラウザで、http://localhost:8080/greet-webapi/resource/receipt-xmlをアクセスすると、 以下のように XML 形式のデータが表示されます。
<itemXmlBeans>
  <itemXmlBean>
    <name>コーラ(缶)</name>
    <price>120</price>
  </itemXmlBean>
  <itemXmlBean>
    <name>サイダー(缶)</name>
    <price>100</price>
  </itemXmlBean>
</itemXmlBeans>


XML取得実行結果


まとめ

JAX-RS について駆け足で簡単に紹介してみましたが、いかがでしたでしょうか。
JAX-RS には、GETだけでなくPOSTされたフォーム入力や、XMLデータを受け取ったりするなど、 紹介しきれなかった機能がまだまだたくさんあります。
またJerseyは、RESTfull(ステートレス)な Web API を支援するだけでなく、 テンプレートでJSPを出力する、MVCフレームワーク機能も実装されているそうです。
詳しくは、参考資料(1,2,3,4,5)を参照ください。

Java EEのためのMVC 1.0JSRの記事では、それらの動きを受けてか 今年の9月末にOracleからJavaEEのためのMVCフレームワークの発表が報告されています。
ステートのあるMVCフレームワークは、ステートのないRESTfullな機能を提供するJAX−RSと異なるアプローチのため コミュニティ内でも意見がわかれているそうですが、Webサービス開発に新しい風が吹いて欲しいですね。

今回は、Javaに不慣れな方でも何をしているのかが判るよう、なるべく手動作業を行いましたが、 NetbeansなどのIDEを使えば、もっと手軽に実装できると思います。(6,7)
私も頑張って、Web APIを作ってみますです。

    参考資料
  1. 今どきのJava Webフレームワークってどうなってるの? (2013/11/08)
  2. JAX-RSはHTML Webアプリケーションを開発するのに充分なフレームワークであるか? (2013/03/17)
  3. Java EE 7(GlassFish V4)でJAX-RSのMVCテンプレートを動かす (2013/06/16)
  4. JAX-RS + Mustache (2013/12/02)
  5. JerseyMVCの使い方メモ (2014/01/26)
  6. Javaを知らない世代が今からはじめるJava EE開発 (2012/12/19)
  7. Java EE 7 検証環境をつくる REST Webサービス (2014/04/06)
  8. Using Jsp in a Jersey JAX-RS RESTful application

【補足】Web APIを世界に公開

作った Web API は、Java Webアプリケーションですから、Herokuで公開することもできると思います。


このページは、勉強のため html5-boilerplate を基に手作業で作成しました。