WicketでXMLを返す機能を作りたい
AjaxとかでJavaScript側から呼び出されるAPIの機能を作りたいなぁ、そんなことを思いながらググっていたら・・・当然ありました。さすがインターネッツ。このページを基にWicketでページのHTMLではなくXMLを返すページを作ってみました。
Hi yo'all,
I did quite a lot Googling and searched this forum, but still did not find what I was looking for.
http://stackoverflow.com/questions/1519392/how-to-prevent-apache-http-client-from-following-a-redirect
Basically I need to create pages that respond with xml content with "text/xml" content-type.
まずはとにもかくにもページクラス
public class ApiPage extends WebPage{
public ApiPage(){
}
@Override
protected void onRender() {
OutputStreamWriter pw = null;
try {
pw = new OutputStreamWriter(((HttpServletResponse) getResponse().getContainerResponse()).getOutputStream(), "utf-8");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.newDocument();
Element response = document.createElement("response");
document.appendChild(response);
・
・
・
ここにXMLを構築する処理
StringWriter sw = new StringWriter();
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
DOMSource domsource = new DOMSource(document);
tf.transform(domsource, new StreamResult(sw));
pw.write(sw.toString());
} catch (Exception e) {
throw new RuntimeException(e);
}
finally{
try {
if(pw!=null)pw.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
//@Override
public final boolean hasAssociatedMarkup() {
return false;
}
@Override
protected void configureResponse(WebResponse response) {
super.configureResponse(response);
response.setContentType("text/xml");
}
つぎにHTML側
特に、必要ありません。
ApiPage.html
<!-- あなたにこのページが見えていますか?ヒャッハー!! -->
あとはページをNiceURLにマウントする。
WebApplication#init()で以下のようにマウント
mountPage("/api", jp.arcanum.hoge.hage.fuga.ApiPage);あとは、実行すると以下のようにページのHTMLではなく、XMLが取得できるようになります。
<?xml version="1.0" encoding="UTF-8"?> <response> ・・・ </response>