You are viewing the documentation for the 2.0.8 release in the 2.0.x series of releases. The latest stable release series is 2.4.x.
§JSON リクエストとレスポンス
§JSON リクエストの処理
JSON リクエストは JSON データをリクエストボディに含む HTTP リクエストです。JSON リクエストは、Content-Type
ヘッダに text/json
か application/json
という MIME タイプを指定する必要があります。
Action
は any content ボディパーサーをデフォルトで使います。これを利用して、リクエストボディを JSON (具体的には、JsValue
) として取得することができます。
def sayHello = Action { request =>
request.body.asJson.map { json =>
(json \ "name").asOpt[String].map { name =>
Ok("Hello " + name)
}.getOrElse {
BadRequest("Missing parameter [name]")
}
}.getOrElse {
BadRequest("Expecting Json data")
}
}
この場合、専用のBodyParser
を指定することで Play にコンテントボディを直接的に JSON としてパースさせると、記述がシンプル化されてなお良いでしょう。
def sayHello = Action(parse.json) { request =>
(request.body \ "name").asOpt[String].map { name =>
Ok("Hello " + name)
}.getOrElse {
BadRequest("Missing parameter [name]")
}
}
Note: JSON ボディパーサーを利用すると、
request.body
の値が直接JsValue
として扱えるようになります。
このアクションは、コマンドラインから cURL を使って以下のようにテストできます。
curl
--header "Content-type: application/json"
--request POST
--data '{"name": "Guillaume"}'
http://localhost:9000/sayHello
レスポンスは以下のようになります。
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 15
Hello Guillaume
§JSON レスポンスの送信
前述の例ではリクエストを JSON で受けていましたが、レスポンスは text/plain
として送信していました。これを、正しい JSON HTTP レスポンスを送り返すように変更してみましょう。
def sayHello = Action(parse.json) { request =>
(request.body \ "name").asOpt[String].map { name =>
Ok(toJson(
Map("status" -> "OK", "message" -> ("Hello " + name))
))
}.getOrElse {
BadRequest(toJson(
Map("status" -> "KO", "message" -> "Missing parameter [name]")
))
}
}
レスポンスは以下のようになります。
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 43
{"status":"OK","message":"Hello Guillaume"}
次ページ: XML