Documentation

You are viewing the documentation for the 2.1.5 release in the 2.1.x series of releases. 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