You are viewing the documentation for the 2.0.x release series. 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
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。