2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Play de アプリ開発 ~PlayFrameworkの基本を知ろう~

2
Posted at

はじめに

Play de アプリ開発ということで前回は環境構築が終わったのでこれから開発していきたいと思います。
環境構築から始める人は前回の記事を参考にしてください。

開発構成

今回は簡単家計簿アプリを作成します。
ただし、少し趣向を変えて行きたいと思います。
フロントエンドはAngularを採用してSPAにします
PlayではTwirlと呼ばれるJavaでいうJSPのようなテンプレートエンジンが採用されているのですが、モダンなWebアプリの開発を視野に入れているためSPAフレームワークのAngularを採用します。Angularである理由は最近私がよく使っているからであってそれ以外は特にありません。

フロントエンドとバックエンドは異なるサーバーに配備するようにします
バックエンドはJSON形式でレスポンスを返すようにし、あえてサーバーを分けることでそれぞれが独立して使用できるようにします。APIがしっかり独立して機能するようにすれば今後iPhoneやAndroidのアプリを開発したとしても開発が容易になるからです。

事前知識

ところで、PlayFrameworkを使っていくにあたり知っておかなければならないことがいくつかあります。
ここで簡単にまとめておきます。

Action

ActionとはPlayFrameworkで用いられるメソッド。リクエストを処理してレスポンスをクライアントに返す際に使用される。ActionはResultと呼ばれる型を返す。
PlayFrameworkでは基本中の基本

index.scala
// 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型のデータ。
JsonJsValueを扱うために用意されたユーティリティが格納されたオブジェクト。主に変換に用いられる。

例えば以下のようなJSONデータがあったとする。

hoge.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で扱うには以下のように記載する。

hoge.scala
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形式に変換することもできる。
例えば以下のようなファイルがあるとする。

Resident.scala
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に変換することができる。

ResidentConverter.scala
package controller

import play.api.libs.json._

import models.Resident._

val resident = Resident("Hiroro", 26, None)
val json = Json.toJson(resident)

まとめ

ここではPlayFrameworkでおさえておかなければならない点について触れました。
詳しく理解するにはやはり公式ドキュメントを参照するのが一番です。
私もまだ十分に理解できていないので公式ドキュメントをみながらしっかり学習していきます。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?