Documentation

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

§XML リクエストの処理

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

Actionany content ボディパーサーをデフォルトで使います。これを利用して、リクエストボディを 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")
  }
}

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

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

Note: 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>

Next: ファイルアップロード処理


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