11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

POSTパラメータの空白はエスケープしないと削除される(MSXML2.ServerXMLHTTP)

Last updated at Posted at 2014-10-01

概要

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 で再現しました。

11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?