§JSON リクエストとレスポンス
§JSON リクエストの処理
JSON リクエストは JSON データをリクエストボディに含む HTTP リクエストです。JSON リクエストは、Content-Type
ヘッダに text/json
か application/json
という MIME タイプを指定する必要があります。
アクションは any content ボディパーサーをデフォルトで使います。これを利用して、リクエストボディを JSON (具体的には Jackson の JsonNode
) として取得することができます。
import com.fasterxml.jackson.databind.JsonNode;
...
public static Result sayHello() {
JsonNode json = request().body().asJson();
if(json == null) {
return badRequest("Expecting Json data");
} else {
String name = json.findPath("name").getTextValue();
if(name == null) {
return badRequest("Missing parameter [name]");
} else {
return ok("Hello " + name);
}
}
}
この場合、専用のBodyParser
を指定することで Play にコンテントボディを直接的に JSON としてパースさせると、記述がシンプル化されてなお良いでしょう。
import com.fasterxml.jackson.databind.JsonNode;
import play.mvc.BodyParser;
...
@BodyParser.Of(BodyParser.Json.class)
public static Result sayHello() {
JsonNode json = request().body().asJson();
String name = json.findPath("name").getTextValue();
if(name == null) {
return badRequest("Missing parameter [name]");
} else {
return ok("Hello " + name);
}
}
ノート: この方法では、JSON 以外のリクエストに対しては自動的に HTTP の 400 番のレスポンスが application/json に設定された Content-type と共に返ってきます。
このアクションは、コマンドラインから 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 レスポンスを送り返すように変更してみましょう。
import play.libs.Json;
import com.fasterxml.jackson.databind.JsonNode;
...
@BodyParser.Of(BodyParser.Json.class)
public static Result sayHello() {
JsonNode json = request().body().asJson();
ObjectNode result = Json.newObject();
String name = json.findPath("name").getTextValue();
if(name == null) {
result.put("status", "KO");
result.put("message", "Missing parameter [name]");
return badRequest(result);
} else {
result.put("status", "OK");
result.put("message", "Hello " + name);
return ok(result);
}
}
レスポンスは以下のようになります。
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 43
{"status":"OK","message":"Hello Guillaume"}
次ページ: XML
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。