Documentation

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

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

§XML リクエストの処理

XML リクエストはリクエストボディに XML データを含む HTTP リクエストです。XML リクエストの Content-Type ヘッダには、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: text/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: text/xml; charset=utf-8
Content-Length: 46

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

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


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