#XML请求的处理和服务
1.处理XML请求
xml请求是以有效的xml内容作为请求体的Http请求。它需要指定'text/xm"MIME类型的Content-Type头。
默认情况下,一个Action使用any content的BodyParser进行解析。你能把内容体转为XML。
public static index sayHello() { Document dom = request().body().asXml(); if(dom == null) { return badRequest("Expecting Xml data"); } else { String name = XPath.selectText("//name", dom); if(name == null) { return badRequest("Missing parameter [name]"); } else { return ok("Hello " + name); } } }
更好更简单的办法是指定自己的BodyParser让Play直接把内容体解析为Xml:
@BodyParser.Of(Xml.class) public static index sayHello() { String name = XPath.selectText("//name", dom); if(name == null) { return badRequest("Missing parameter [name]"); } else { return ok("Hello " + name); } }
住:这种方式下,非XML的请求会返回HTTP400状态。
在命令行下用cURL命令测试一下:
curl --header "Content-type: text/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
2.提供XML响应
之前的例子,我们处理了Xml请求,但是返回的趋势"text/plain"的响应。我们把它变为返回有效的xml响应:
@BodyParser.Of(Xml.class) public static index sayHello() { String name = XPath.selectText("//name", dom); if(name == null) { return badRequest("<message \"status\"=\"KO\">Missing parameter [name]</message>"); } else { return ok("<message \"status\"=\"OK\">Hello " + name + "</message>"); } }
现在的返回是:
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: 46 <message status="OK">Hello Guillaume</message>