LoginSignup
0

More than 5 years have passed since last update.

Play 2.5に入門  ⑦httpieを使いながらPlay'Rの例題を手直し

Last updated at Posted at 2016-04-30

例題の手直しに挑戦

前回見たPlay Scalaの簡単RESTフレームワークPlay'R、良さ気だったのだけれど、例題の更新系(PUT/POST)が動かなかった。ぱっと見、何らかの理由で、Json周りの処理が書かれていなかったぽいっので、データを更新できるようにしておこう。

PUTメソッドの手直し

はじめは、Personの書き換え(PUT)に関するメソッドを手直しする:

controller/PersonController.scala
  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の挙動を見ておこう。

jane.PNG

PUTメソッドで、JaneがJIROに変わってくれないことが問題。

これは、メソッド中でのAnyContentAsJsonクラスの扱いが不適切なことによる。

何が起きているのかを、print文デバックで試しておこう。

controller/PersonController.scala
  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の変換が無意味であることが分かる:

some.PNG

そこで、以下のようにasJsonを用いる形に書き換えてみる:

controller/PersonController改.scala

//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")
    }
  }

jiro.PNG

動作した。

POSTメソッドの手直し

同様に、新規登録に関するcreateメソッドを手直ししておく(元コードは省略)。

controller/PersonController改.scala
  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")
    }
  }

genji.PNG

...IDが一つ飛んで6番になってしまったが、、動作した。

感想と、次回の取組み

Httpie(もしくはcurl)と、playの動的コンパイル機能とを組み合わせることで、例題を容易に修正できた。取り急ぎの少し無理やりな修正だったので、次回は、PlayFrameworkのplay-jsonの演習を兼ねて、もう少し丁寧な手直しに取り組んでみたい。

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
0