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>