Documentation

You are viewing the documentation for the 2.1.x release series. The latest stable release series is 2.4.x.

§JSON リクエストとレスポンス

§JSON リクエストの処理

JSON リクエストは JSON データをリクエストボディに含む HTTP リクエストです。JSON リクエストは、Content-Type ヘッダに text/jsonapplication/json という MIME タイプを指定する必要があります。

アクションは any content ボディパーサーをデフォルトで使います。これを利用して、リクエストボディを JSON (具体的には Jackson の JsonNode) として取得することができます。

import org.codehaus.jackson.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 org.codehaus.jackson.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 org.codehaus.jackson.node.ObjectNode;
...

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