You are viewing the documentation for the 2.6.x development release. 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(BodyParser.Xml.class)
public static Result sayHelloBP() {
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(BodyParser.Xml.class)
public static Result replyHello() {
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>
Next: ファイルアップロード処理
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。