Play 2.0 中文资料 - 使用 XML
Unmi 注: 有了前面对 Play 2.0 的 Json 支持的了解。见:1. Play 2.0 中文资料 - Play JSON 库,2. Play 2.0 中文资料 - 处理和响应 JSON 请求, 3. Play 2.0 中文资料 - Play JSON 库使用泛型。现在来看 Play 2.0 对 XML 的支持就更简单了,原因是 Scala 使用 Json 还需依赖于第三方的库 Jackson,而 Scala 对 XML 的支持直接利益于它的内建语法。如在 Scala 控制台下:
上面演示了 Scala XML 遍历 XML,访问属性,文本节点。方法和遍历 JSON 类似,也有 \ 和 \\ 方法。例如 user\"@name" 访问 name 属性。
而且有了 Scala 这样的内建语法,想要实现 toXML, fromXML 方法也很简单。
处理 XML 请求
XML 请求是指请求体为一个有效的 XML 数据的 HTTP 请求. 必须用
默认情况下,
Unmi 注: headOption 方法是取第一个节点,如上面只会处理找到的第一个 name 节点,如果不调用 headOption 方法则会遍历所有的 name 节点。
更好的方法 (也是更简单的) 是指定我们自己的
Unmi 注: 同样在 Unix 簇系统下,命令分号须用 \ 进行续行,并注意加上相应的空格。可能要给 curl 加上 -v,或 -i 才能看到这些详细的输出。
回应是:
输出 XML 应用
在我们前面的例子中处理了 XML 请求, 但我们输出的详应是用的
Unmi 注: 传给 Ok 方法的数据类型是 scala.xml.Elem,该响应则会自动加上 Content-Type: text/xml。
现在的回应是:
永久链接 https://yanbin.blog/play2-0-tutorials-cn-handling-and-serving-xml-requests/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
上面演示了 Scala XML 遍历 XML,访问属性,文本节点。方法和遍历 JSON 类似,也有 \ 和 \\ 方法。例如 user\"@name" 访问 name 属性。而且有了 Scala 这样的内建语法,想要实现 toXML, fromXML 方法也很简单。
处理 XML 请求
XML 请求是指请求体为一个有效的 XML 数据的 HTTP 请求. 必须用
Content-Type 头指定 MIME 类型为 text/xml.默认情况下,
Action 使用的是 any content 作为 Body 解析器, 它使得你获取到的 body 可转换成一个 XML (实际是一个 NodeSeq): 1def 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}Unmi 注: headOption 方法是取第一个节点,如上面只会处理找到的第一个 name 节点,如果不调用 headOption 方法则会遍历所有的 name 节点。
更好的方法 (也是更简单的) 是指定我们自己的
BodyParser,它会告诉 Play 把内容体直接解析为 XML:1def 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}注: 当使用 XML 作为 Body 解析器时,你可以在命令行下用命令 cURL 进行测试:request.body就直接是个有效的NodeSeq 了.
1curl
2 --header "Content-type: text/xml"
3 --request POST
4 --data '<name>Guillaume</name>'
5 http://localhost:9000/sayHelloUnmi 注: 同样在 Unix 簇系统下,命令分号须用 \ 进行续行,并注意加上相应的空格。可能要给 curl 加上 -v,或 -i 才能看到这些详细的输出。
回应是:
1HTTP/1.1 200 OK
2Content-Type: text/plain; charset=utf-8
3Content-Length: 15
4
5Hello Guillaume输出 XML 应用
在我们前面的例子中处理了 XML 请求, 但我们输出的详应是用的
text/plain. 让我们加以变化,使之回送出一个有效的 XML HTTP 响应:1def 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}Unmi 注: 传给 Ok 方法的数据类型是 scala.xml.Elem,该响应则会自动加上 Content-Type: text/xml。
现在的回应是:
1HTTP/1.1 200 OK
2Content-Type: text/xml; charset=utf-8
3Content-Length: 46
4
5<message status="OK">Hello Guillaume</message>[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。