ドキュメント

§XMLリクエストの処理と提供

§XMLリクエストの処理

XMLリクエストは、有効なXMLペイロードをリクエストボディとして使用するHTTPリクエストです。`Content-Type`ヘッダーに`application/xml`または`text/xml` MIMEタイプを指定する必要があります。

デフォルトでは、アクションは**任意のコンテンツ**ボディパーサーを使用します。これを使用して、ボディをXML(実際には`org.w3c.Document`)として取得できます。

public Result sayHello(Http.Request request) {
  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として解析するようにPlayに要求する独自の`BodyParser`を指定する方がはるかに優れており(そして簡単です)。

@BodyParser.Of(BodyParser.Xml.class)
public Result sayHelloBP(Http.Request request) {
  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以外のリクエストに対して400 HTTPレスポンスが自動的に返されます。

コマンドラインで**`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 Result replyHello(Http.Request request) {
  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>")
          .as("application/xml");
    } else {
      return ok("<message \"status\"=\"OK\">Hello " + name + "</message>").as("application/xml");
    }
  }
}

以下のように返答します。

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

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

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


このドキュメントにエラーを見つけた場合、このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に送ってください。質問やアドバイスを共有したい場合は、コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。