#例題の手直しに挑戦
前回見たPlay Scalaの簡単RESTフレームワークPlay'R、良さ気だったのだけれど、例題の更新系(PUT/POST)が動かなかった。ぱっと見、何らかの理由で、Json周りの処理が書かれていなかったぽいっので、データを更新できるようにしておこう。
PUTメソッドの手直し
はじめは、Personの書き換え(PUT)に関するメソッドを手直しする:
def write(person: Person) = Action { request =>
request.body.asText match {
case Some(name) if (name.length > 0) => Ok(personContainer.update(person.copy(name=name)).name)
case _ => BadRequest("Invalid name")
}
}
前回同様、httpieを使ってPUTの挙動を見ておこう。
PUTメソッドで、JaneがJIROに変わってくれないことが問題。
これは、メソッド中でのAnyContentAsJsonクラスの扱いが不適切なことによる。
何が起きているのかを、print文デバックで試しておこう。
def write(person: Person) = Action { request =>
println("!!!!!!!!!AnyContentAsJsonの挙動だよ!!!!!!!!!")
println("request.body ="+request.body)
println("request.body.asJson ="+request.body.asJson)
println("request.body.asText ="+request.body.asText)
println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
request.body.asText match {
case Some(name) if (name.length > 0) => Ok(personContainer.update(person.copy(name=name)).name)
case _ => BadRequest("Invalid name")
}
}
play側のログを見てみると、request.body.asTextの変換が無意味であることが分かる:
そこで、以下のようにasJsonを用いる形に書き換えてみる:
//jsonの扱いに必要なライブラリをインポートしておく
import play.api.libs.json._
import play.api.libs.functional.syntax._
...
def write(person: Person) = Action { request =>
request.body.asJson match {
case Some(jsObj) =>
val name = (jsObj \\ "name").head.toString
Ok(personContainer.update(person.copy(name=name)).name)
case _ => BadRequest("Invalid name")
}
}
動作した。
POSTメソッドの手直し
同様に、新規登録に関するcreateメソッドを手直ししておく(元コードは省略)。
def create = Action { request =>
request.body.asJson match {
case Some(jsObj) =>
val name = (jsObj \\ "name").head.toString
Created(personContainer.add(name).name)
case _ => BadRequest("Invalid name")
}
}
...IDが一つ飛んで6番になってしまったが、、動作した。
#感想と、次回の取組み
Httpie(もしくはcurl)と、playの動的コンパイル機能とを組み合わせることで、例題を容易に修正できた。取り急ぎの少し無理やりな修正だったので、次回は、PlayFrameworkのplay-jsonの演習を兼ねて、もう少し丁寧な手直しに取り組んでみたい。