处理XML请求和提供XML响应

处理XML请求

XML请求是指HTTP请求将有效的XML格式的内容作为请求体,该HTTP请求必须在Content-Type中指定它的MIME类型为application/xml或者text/xml

一般来说,Action使用任意内容解析器,这使得程序可以接受XML格式的请求体(实际上是作为NodeSeq类处理):

  1. def sayHello = Action { request =>
  2. request.body.asXml.map { xml =>
  3. (xml \\ "name" headOption).map(_.text).map { name =>
  4. Ok("Hello " + name)
  5. }.getOrElse {
  6. BadRequest("Missing parameter [name]")
  7. }
  8. }.getOrElse {
  9. BadRequest("Expecting Xml data")
  10. }
  11. }

更好(也更简单)的方法是明确给定我们要用的BodyParser,让Play框架直接将请求体内容当作XML格式解析:

  1. def sayHello = Action(parse.xml) { request =>
  2. (request.body \\ "name" headOption).map(_.text).map { name =>
  3. Ok("Hello " + name)
  4. }.getOrElse {
  5. BadRequest("Missing parameter [name]")
  6. }
  7. }
  1. 注意:在使用XML内容解析器时,request.body本身就是一个有效的NodeSeq实例

在命令行中可以使用cURL测试XML请求处理接口:

  1. curl
  2. --header "Content-type: application/xml"
  3. --request POST
  4. --data '<name>Guillaume</name>'
  5. http://localhost:9000/sayHello

返回的内容是:

  1. HTTP/1.1 200 OK
  2. Content-Type: text/plain; charset=utf-8
  3. Content-Length: 15
  4. Hello Guillaume

提供XML响应

在之前的例子中,我们展示了如何使用Play框架处理XML请求,但是响应的格式是text/plain。下面的代码展示了如何返回一个XML格式的HTTP响应。

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

然后还是使用cURL命令测试,返回的内容如下:

  1. HTTP/1.1 200 OK
  2. Content-Type: application/xml; charset=utf-8
  3. Content-Length: 46
  4. <message status="OK">Hello Guillaume</message>