: O. Yuanying

やっぱり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でも行けるのかな?

とりあえず後で試してみよう…。