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