#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>