文档

§处理和服务 XML 请求

§处理 XML 请求

XML 请求是使用有效 XML 负载作为请求主体进行的 HTTP 请求。它必须在 Content-Type 标头中指定 application/xmltext/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")
    }
}

最好(也更简单)指定我们自己的 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]")
  }
}

注意:使用 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>

下一步:处理文件上传


在本文档中发现错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有任何问题或建议要分享?请访问 我们的社区论坛,与社区开始对话。