はじめに
Play de アプリ開発ということで前回は環境構築が終わったのでこれから開発していきたいと思います。
環境構築から始める人は前回の記事を参考にしてください。
開発構成
今回は簡単家計簿アプリを作成します。
ただし、少し趣向を変えて行きたいと思います。
・フロントエンドはAngularを採用してSPAにします
PlayではTwirlと呼ばれるJavaでいうJSPのようなテンプレートエンジンが採用されているのですが、モダンなWebアプリの開発を視野に入れているためSPAフレームワークのAngularを採用します。Angularである理由は最近私がよく使っているからであってそれ以外は特にありません。
・フロントエンドとバックエンドは異なるサーバーに配備するようにします
バックエンドはJSON形式でレスポンスを返すようにし、あえてサーバーを分けることでそれぞれが独立して使用できるようにします。APIがしっかり独立して機能するようにすれば今後iPhoneやAndroidのアプリを開発したとしても開発が容易になるからです。
事前知識
ところで、PlayFrameworkを使っていくにあたり知っておかなければならないことがいくつかあります。
ここで簡単にまとめておきます。
Action
ActionとはPlayFrameworkで用いられるメソッド。リクエストを処理してレスポンスをクライアントに返す際に使用される。ActionはResultと呼ばれる型を返す。
PlayFrameworkでは基本中の基本。
// text形式でレスポンスされる
def index = Action {
Ok("Hello!")
}
// json形式でレスポンスされる
def hoge = Action {
Ok("{'msg' : 'Hello!'}").as("application/json")
}
// 引数あり
def fuga(id:Long) = Action {
Ok("The ID is" + id)
}
Okはステータスコード200を返す。
他にもNotFound, BadRequest, InternalServerErrorがあり、適切なステータスコードを返してくれる。
Route
RouteはURLからどの処理を実行するかを記載した設定ファイル。
:idや*nameとすることで動的に対応することもできる。
GET / controllers.HomeController.index()
GET /hoge/ controllers.HomeController.hoge()
GET /fuga/:id controllers.HomeController.fuga(id: Long)
POST /hoge/ controllers.HomeController.hogePost()
JSON
個人的によくハマったところ。
PlayではJSONを扱えるようにするためのライブラリーがデフォルトで用意されている。
使いこなすためにはいくつか知っておくべきことがある。
詳しくは公式ドキュメントを確認することをオススメする。
JsValueとJson
JsValueはPlayで扱うJSON型のデータ。
JsonはJsValueを扱うために用意されたユーティリティが格納されたオブジェクト。主に変換に用いられる。
例えば以下のようなJSONデータがあったとする。
{
"name" : "Watership Down",
"location" : {
"lat" : 51.235685,
"long" : -1.309197
},
"residents" : [ {
"name" : "Fiver",
"age" : 4,
"role" : null
}, {
"name" : "Bigwig",
"age" : 6,
"role" : "Owsla"
} ]
}
これをPlayで扱うには以下のように記載する。
import play.api.libs.json.{ JsNull, Json, JsString, JsValue } // 必ずインポートすること
val json: JsValue = Json.obj(
"name" -> "Watership Down",
"location" -> Json.obj("lat" -> 51.235685, "long" -> -1.309197),
"residents" -> Json.arr(
Json.obj(
"name" -> "Fiver",
"age" -> 4,
"role" -> JsNull
),
Json.obj(
"name" -> "Bigwig",
"age" -> 6,
"role" -> "Owsla"
)
)
)
また、自ら定義したモデルクラスをJson形式に変換することもできる。
例えば以下のようなファイルがあるとする。
package models
import play.api.libs.json._
object Resident {
// 独自クラスからの変換には必ず定義しなければならない
implicit val residentWrites = Json.writes[Resident]
case class Resident(name: String, age: Int, role: Option[String])
}
このファイルをimportすればJSONに変換することができる。
package controller
import play.api.libs.json._
import models.Resident._
val resident = Resident("Hiroro", 26, None)
val json = Json.toJson(resident)
まとめ
ここではPlayFrameworkでおさえておかなければならない点について触れました。
詳しく理解するにはやはり公式ドキュメントを参照するのが一番です。
私もまだ十分に理解できていないので公式ドキュメントをみながらしっかり学習していきます。