Javaフレームワーク「Play Framework」でWeb APIを作成する(2)

普段のお仕事に役立つ普遍的なプログラミングTIPSや、業界で注目度が高い最新情報をお届けする「編集部ピックアップ」。
今回はJavaのWebアプリケーションフレームワーク「Play Framework」の開発環境を構築し、Web APIを作成する方法についてお届けします。

Play Frameworkは「Java」と「Scala」を使って作られたWebフレームワークです。「Ruby on Rails」や「Django」と同じくMVC(Model-View-Controller)と呼ばれる設計モデルに基づいて、Webアプリ開発を素早く行うことができるという特徴があります。

前半の記事では、「Play Framework 2.8」での開発環境の構築方法についてご紹介しました。

今回はこちらの環境を用いて、Play FrameworkでWeb APIを作成する方法をご紹介します。

データベースの作成

Play Frameworkの開発環境を構築したら、次はデータベースの構築を行います。今回はPlay Frameworkに組み込まれている「H2」データベースを構築する方法をご紹介します。

h2-browserの起動

「H2」データベースを利用する際に便利な「h2-browser」の立ち上げを行います。「conf/ application.conf」に以下を追記します。

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
db.default.user=sa
db.default.password=""

次に実際にH2データベースを使用することを宣言します。プロジェクト直下にある「build.sbt」に以下を追記します。

libraryDependencies += guice
libraryDependencies += "com.h2database" % "h2" % "1.4.199"

コマンドプロンプトからSBTを立ち上げて以下のコマンドを入力します。
※ SBTを立ち上げるには、コマンドプロンプトからプロジェクトのフォルダで「sbt」コマンドを実行します。

h2-browser
H2コンソールの起動

Web APIの作成

H2データベースの設定が完了したら、次はWeb APIを作成していきます。データベース操作としてJava用のオブジェクト関係マッピング(ORM)ライブラリである「Ebean」を使って、データの取得(GET)、追加(POST)、更新(PUT)、削除(DELETE)の処理を設定します。

Ebeanの作成

それでは実際にEBeanファイルを作成していきましょう。
まず初めにEBeanを格納するパッケージを指定します。「conf/application.conf」に以下を追記します。

ebean.default="models.*"

次に「app」フォルダの下に「models」フォルダを作成して、そこにEbeanを格納します。

クラスファイルを新規追加し、「io.ebean.Model」を継承したEbeanを作成します。今回は動作確認として「ID」、「ユーザー名」、「年齢」の項目を持つ「PlayEBean.java」を作成します。

package models;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;

import io.ebean.Finder;
import io.ebean.Model;

@Entity
public class PlayEBean extends Model {
   @Id
   public Long id;

   @NotNull
   public String userName;

   public Long age;

   public static Finder<Long, PlayEBean> find = 
	        new Finder<Long, PlayEBean>(PlayEBean.class);
}

今回使用したEbeanで用意されているアノテーションは以下の通りです。

@Entity該当クラスがDBテーブルを表すオブジェクトを指定します
@IdDBテーブルの一意制約キー(primary key)です
@NotNull必須入力を示す項目の場合に指定します

上記のEbeanを作成し、Webブラウザから対象のプロジェクトにアクセスすると自動的にCreateSQLが作成されます。

また、Ebeanが必要とする「javax-api」を使用するため、「build.sbt」を変更します。

lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean)
・・・(中略)
libraryDependencies ++= Seq(
      guice,
      jdbc,
      "com.h2database" % "h2" % "1.4.199",
      // To provide an implementation of JAXB-API, which is required by Ebean.
      "javax.xml.bind" % "jaxb-api" % "2.3.1",
      "javax.activation" % "activation" % "1.1.1",
      "org.glassfish.jaxb" % "jaxb-runtime" % "2.3.2",
      )

HomeControllerの修正

Ebeanの作成と、各設定ファイルの変更が完了したらWeb APIの実行ファイルを修正します。「app/controllers/HomeController.java」を以下のように修正します。

package controllers;

import java.util.List;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import io.ebean.Finder;
import models.PlayEBean;
import play.mvc.Controller;
import play.mvc.Http;
import play.mvc.Result;

public class HomeController extends Controller {

    public Result index() {
        return ok(views.html.index.render());
    }
  
  // 参照  
	public Result select(Long id) {

		Finder<Long, PlayEBean> finder = new Finder<Long, PlayEBean>(PlayEBean.class);

		// JSON変換用クラス
		ObjectMapper mapper = new ObjectMapper();
		String js = "";

		if (id == 0) {
			List<PlayEBean> list = finder.all();
			
			try {
				// JSON文字列に変換
				js = mapper.writeValueAsString(list);
			} catch (JsonProcessingException e) {
				e.printStackTrace();
			}
		} else {
			PlayEBean dto = finder.byId(id);

			try {
				// JSON文字列に変換
				js = mapper.writeValueAsString(dto);
			} catch (JsonProcessingException e) {
				e.printStackTrace();
			}
		}
		return ok(js).as("application/json");
	}

	// 登録
	public Result create(Http.Request request) {

		JsonNode json = request.body().asJson();
		PlayEBean dto = new PlayEBean();
		dto.userName = json.get("name").textValue();
		dto.age = json.get("age").longValue();
		dto.save();

		// JSON変換用クラス
		ObjectMapper mapper = new ObjectMapper();
		String js = "";
		try {
			// JSON文字列に変換
			js = mapper.writeValueAsString(dto);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
		
		return ok(js).as("application/json");
	}

	// 更新
	public Result update(Long id, Http.Request request) {

		JsonNode json = request.body().asJson();

		Finder<Long, PlayEBean> finder = new Finder<Long, PlayEBean>(PlayEBean.class);
		PlayEBean dto = finder.byId(id);
		dto.userName = json.get("name").textValue();
		dto.age = json.get("age").longValue();
		dto.update();

		return select(id);
	}

	// 削除
	public Result delete(Long id) {

		Finder<Long, PlayEBean> finder = new Finder<Long, PlayEBean>(PlayEBean.class);
		PlayEBean dto = finder.byId(id); // Id=3の対象を検索
		dto.delete();

		return ok("user deleted");
	}
}

routesファイルの変更

Webブラウザからのアクセスとして、Getメソッドの呼び出しに対応できるように「conf/routes」ファイルを変更します。以下のファイルに追記してください。

# 参照(全件)用メソッド
GET     /Users           controllers.HomeController.select(id: Long=0)
# 参照(1件)用メソッド
GET     /Users/:id       controllers.HomeController.select(id: Long)
# 登録用メソッド
POST    /Users           controllers.HomeController.create(request: Request)
# 更新用メソッド
PUT     /Users/:id       controllers.HomeController.update(id: Long, request: Request)
# 削除用メソッド
DELETE  /Users/:id       controllers.HomeController.delete(id: Long)

Web APIの起動

ここまでの設定が完了したらWeb APIを実行して動作確認を行いましょう。コマンドプロンプトからプロジェクトのフォルダにcdコマンドで移動し、以下のコマンドでサーバを起動します。

sbt run

サーバが起動したら、ブラウザに「http://localhost:9000」とURLを入力します。
画面に表示されている[Apply this script now!]をクリックすることで「conf/evolutions/default/1.sql」にDBテーブルが作成されます。

SQLスクリプトの実行
作成されたSQLファイル

実際にH2のブラウザ管理ツールで確認してみます。「JDBC URL」に「jdbc:h2:mem:play」を入力して、[接続]をクリックします。

H2コンソールにログイン

まだデータを登録していないので空テーブルではありますが、「PLAY_EBEAN」テーブルが作成されていることが確認できます。

作成されたテーブルの確認

Web APIの実行

最後にPostmanなどのツールを使用してリクエストを送信し、テストしてみます。

POST(登録)

http://localhost:9000/Users」に対してPOSTリクエストを実行してデータを登録します。以下のJSONをBodyに追加して実行します。

{
    "name": "柚木 絢乃",
    "age": 26
}

また、この後の他のリクエストの確認をしやすくするために、同様の手順で何件かデータを登録しておきます。

GET(参照)

http://localhost:9000/Users」に対してGETリクエストを実行します。先ほど登録したデータが取得されます。

http://localhost:9000/Users/3」のようにURLでIDを指定してデータを取得することもできます。

PUT(更新)

http://localhost:9000/Users/3」に対してPUTリクエストを実行します。以下のJSONをBodyに追加し、ID=3のデータを更新します。

{
    "name": "かまど たんじろう",
    "age": 15
}

DELETE(削除)

http://localhost:9000/Users/3」に対してDELETEリクエストを実行し、ID=3のデータを削除します。

Play Frameworkとも連携可能なJavaScriptライブラリ

以上がPlay Frameworkで簡単なWeb APIを実装する方法でした。
弊社ではPlay Frameworkをはじめとした各種フレームワークとも連携可能なJavaScriptライブラリを提供しています。今回ご紹介したようなWeb APIを使用すればデータ連携も簡単に行うことができるので、こちらも気になった方は是非Webサイトをご確認ください。