Play 2.5에 입문 ⑦ httpie를 사용하면서 Play'R의 예제를 수정

예제의 수정에 도전



지난번 본 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의 거동을 봐 두자.



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의 변환이 무의미하다는 것을 알 수 있습니다.



따라서 다음과 같이 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")
    }
  }



작동했다.

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



... ID가 하나 날아 6번이 되어 버렸지만, 동작했다.

감상과 다음의 대처



Httpie(혹은 curl)과 play의 동적 컴파일 기능을 조합하는 것으로, 예제를 용이하게 수정할 수 있었다. 급한 조금 무리한 수정이었기 때문에, 다음번은, PlayFramework의 play-json의 연습을 겸해, 좀 더 정중한 재작업에 임해 보고 싶다.

좋은 웹페이지 즐겨찾기