ドキュメント

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

§XMLリクエストの処理

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

デフォルトでは、`Action`は**任意のコンテンツ**ボディパーサーを使用します。これにより、ボディをXML(実際には`NodeSeq`)として取得できます。

def sayHello = Action { request =>
  request.body.asXml
    .map { xml =>
      (xml \\ "name" headOption)
      .map(_.text)
      .map { name => Ok("Hello " + name) }
      .getOrElse {
        BadRequest("Missing parameter [name]")
      }
    }
    .getOrElse {
      BadRequest("Expecting Xml data")
    }
}

Playにコンテンツボディを直接XMLとして解析するように指示するために、独自の`BodyParser`を指定する方がはるかに優れており(そして簡単です)。

def sayHello = Action(parse.xml) { request =>
  (request.body \\ "name" headOption)
  .map(_.text)
  .map { name => Ok("Hello " + name) }
  .getOrElse {
    BadRequest("Missing parameter [name]")
  }
}

**注:** XMLボディパーサーを使用する場合、`request.body`の値は直接有効な`NodeSeq`になります。

コマンドラインから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レスポンスを送信するように変更しましょう。

def sayHello = Action(parse.xml) { request =>
  (request.body \\ "name" headOption)
  .map(_.text)
  .map { name =>
    Ok(<message status="OK">Hello
        {name}
      </message>)
  }
  .getOrElse {
    BadRequest(<message status="KO">Missing parameter [name]</message>)
  }
}

応答は次のようになります。

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

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

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


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