Documentation

You are viewing the documentation for the 2.2.0 release in the 2.2.x series of releases. The latest stable release series is 2.4.x.

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

§XML リクエストの処理

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

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

public static Result sayHello() {
  Document dom = request().body().asXml();
  if(dom == null) {
    return badRequest("Expecting Xml data");
  } else {
    String name = XPath.selectText("//name", dom);
    if(name == null) {
      return badRequest("Missing parameter [name]");
    } else {
      return ok("Hello " + name);
    }
  }
}

この場合、専用のBodyParser を指定することで Play にコンテントボディを直接的に XML としてパースさせると、記述がシンプル化されてなお良いでしょう。

@BodyParser.Of(Xml.class)
public static Result sayHello() {
  Document dom = request().body().asXml();
  if(dom == null) {
    return badRequest("Expecting Xml data");
  } else {
    String name = XPath.selectText("//name", dom);
    if(name == null) {
      return badRequest("Missing parameter [name]");
    } else {
      return ok("Hello " + name);
    }
  }
}

ノート: この方法では、XML 以外のリクエストに対しては自動的に HTTP の 400 番のレスポンスが返ってきます。

このアクションは、コマンドラインから cURL を使って以下のようにテストできます。

curl 
  --header "Content-type: application/xml" 
  --request POST 
  --data '<name>Guillaume</name>' 
  http://localhost:9000/sayHello

レスポンスは以下のようになります。

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 15

Hello Guillaume

§XML レスポンスの送信

前述の例では XML リクエストを処理して、text/plain のレスポンスを返してしまっていました。これを、正しい XML HTTP レスポンスを送り返すように変更してみましょう。

@BodyParser.Of(Xml.class)
public static Result sayHello() {
  Document dom = request().body().asXml();
  if(dom == null) {
    return badRequest("Expecting Xml data");
  } else {
    String name = XPath.selectText("//name", dom);
    if(name == null) {
      return badRequest("<message \"status\"=\"KO\">Missing parameter [name]</message>");
    } else {
      return ok("<message \"status\"=\"OK\">Hello " + name + "</message>");
    }
  }
}

レスポンスは以下のようになります。

HTTP/1.1 200 OK
Content-Type: application/xml; charset=utf-8
Content-Length: 46

<message status="OK">Hello Guillaume</message>

次ページ: ファイルアップロードの処理