概要
POSTリクエストを行う際、空白は+
または%20
で置換する必要があります。
MSXML2.ServerXMLHTTP
では、これを忘れると空白が削除され、データの内容が変わってしまいます。
問題
下記のコードは、example.comにXML文字列myxml
をPOSTしています。
var param = 'myxml=<xyz attr="one">...</xyz>'
var objSrvHTTP = Server.CreateObject('Msxml2.ServerXMLHTTP.6.0');
objSrvHTTP.open ('POST', 'http://example.com', false);
objSrvHTTP.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
objSrvHTTP.send(param);
しかし、このままではパラメータmyxml
の中の空白が下記のように削除されてしまいました。
myxml=<xyzattr="one">...</xyz>
解決方法
すべてのスペースを+
または%20
に置換したものを送信します。
...
objSrvHTTP.send(param.replace(/\s/g, '+'));
// or
objSrvHTTP.send(param.replace(/\s/g, '%20'));
これで想定通りになります。
myxml=<xyz attr="one">...</xyz>
追記
今回のケースでは上記の修正で問題なく動きますが、一般にHTTPリクエストでパラメータを送る場合はencodeURIComponent
を使います。
objSrvHTTP.send(encodeURIComponent(param));
これにより、パラメータ値に&などの文字を含んでいるとケースでも問題なく送ることができます。
メモ
Classic ASP で再現しました。