やっぱりXMLデータをPOSTしたいよね
XMLHttpRequestでデータをPOSTするときに、従来のFormから送るようなフォーマットでデータを送りたい場合は、content-typeを「application/x-www-form-urlencoded」に指定してやる必要があった。けどやっぱりこれはXMLHttpRequestでデータをPOSTする時はXMLを使ってね、って事なんだろうなあと理解。
ちゅうことで以下のようなコードを書いてXMLHttpRequestを使用してサーバ(私はJSPに対して)データをPOSTしてみました。
var req = new XMLHttpRequest();
if (req) {
req.onreadystatechange = function(){
if (req.readyState == 4 && req.status == 200) {
alert(req.responseText);
}
};
var url = "test1.jsp";
req.setRequestHeader("content-type","text/xml");
req.open('POST', url);
req.send('<?xml version="1.0" encoding="UTF-8" ?>\n'+
'<data-source type="info.fractus.coli.da.HsqlPoolDataAccess">\n'+
'<property name="password" value=""/>\n'+
'<property name="url" value="jdbc:hsqldb:"/>\n'+
'<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>\n'+
'<property name="path" value="/WEB-INF/db"/>\n'+
'<property name="username" value="sa"/>\n'+
'</data-source>');
}
受け取るJSPのコードは単純に受け取ったデータを標準出力に吐き出してるだけです。
<?xml version="1.0" encoding="UTF-8" ?>
<%@page contentType="text/xml; charset=UTF-8" %>
<%
java.io.BufferedReader reader = new java.io.BufferedReader(
new java.io.InputStreamReader(request.getInputStream(),"UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
%>
<response>
<return>0</return>
</response>
試してみるとわかりますがちゃんとXMLのデータを受け取っています。実際にアプリケーションとして処理する場合には、サーバは受け取ったXMLデータをDOMやらSAXを使って処理するのでしょうね。
けどこれって、あんまり(クライアント側には)XMLの利点って無いですよね?同じデータを送信したいのなら以下のようなコードを書いたって良い訳です。
req.setRequestHeader("content-type",
"application/x-www-form-urlencoded;charset=UTF-8");
req.send('type=info.fractus.coli.da.HsqlPoolDataAccess&'+
'password=&'+
'url=jdbc:hsqldb:&'+
'driverClassName=org.hsqldb.jdbcDriver&'+
'path=/WEB-INF/db&'+
'username=sa');
そんな事を思いながらグーグルを徘徊していると以下のようなコードを発見。
var doc = new ActiveXObject("Microsoft.XMLDOM"); var dec =doc.createProcessingInstruction( "xml","version='1.0'"); doc.appendChild(dec); var rootElement=doc.createElement("param"); var dataElement=doc.createElement("id"); var dataText=doc.createTextNode(param); dataElement.appendChild(dataText); rootElement.appendChild(dataElement); doc.appendChild(rootElement); var objHttp=new ActiveXObject("Microsoft.XMLHTTP"); objHttp.Open("POST",URL, false); objHttp.Send(doc);
このコードをそのまま使おうとするとIE専用になってしまいますが、要するにDOMを使ってXMLドキュメントオブジェクト?を生成し、それをそのままXMLHttpRequestのsendメソッドに渡すというものです。
なるほど、、、調べてみるとGeckoにもXMLドキュメントを生成する方法があるようだし、これを使えばFirefoxでも行けるのかな?
とりあえず後で試してみよう…。