はじめに
JScriptでHTTPアクセスする場合、ActiveXObjectとして、「XMLHTTP」「ServerXMLHTTP」の二種類があります。
Microsoftによれば、「XMLHTTP」はクライアント用、「ServerXMLHTTP」はサーバ用となっていますが、
ここでは、タイムアウトなどが指定できる、「ServerXMLHTTP」を利用します。
GET
簡単なGETのサンプルです。
「open」メソッドの引数は以下となります。
引数 | 名前 | 説明 |
---|---|---|
1 | method | 要求メソッド |
2 | URL | 要求先URL |
3 | Async | 非同期フラグ、デフォルトは「false」(オプション) |
4 | User | 認証ユーザ(オプション) |
5 | Password | 認証パスワード(オプション) |
「Async」がデフォルト「false」なので、同期として動作します。
何故、デフォルト値をわざわざ設定しているかというと、「XMLHTTP」の場合はデフォルト「true」なので
コードを流用した時にハマりやすためです。
try {
// 「ServerXMLHTTP」オブジェクト生成
var http = new ActiveXObject("Msxml2.ServerXMLHTTP");
// 要求初期化
http.open("GET", "http://xxx.xxx.xxx.xxx/yyyyy/", false);
// 要求
http.send();
// 応答結果表示
WScript.Echo(http.status + ":" + http.statusText);
WScript.Echo(http.getAllResponseHeaders());
WScript.Echo(http.responseText);
} catch (e) {
// エラーの場合
WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
}
POST
簡単な「POST」のサンプルです。
「GET」との違いは、メソッド名が「POST]になった事と、
要求ヘッダに「Content-Type: application/x-www-form-urlencoded」が必要だということです。
これを設定しないと、サーバ側でパラメータを取得してくれません。
また、パラメータをエスケープする関数も付け加えました。
ほとんどの場合、「encodeURIComponent」だけでも解釈してくれそうですが、
一応、スペースは「%20」ではなく「+」にするのが正しいそうです。
try {
// 「ServerXMLHTTP」オブジェクト生成
var http = new ActiveXObject("Msxml2.ServerXMLHTTP");
// 要求初期化
http.open("POST", "http://xxx.xxx.xxx.xxx/yyyyy/", false);
// 要求ヘッダ設定
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// 要求
var params = { aaa: "bbb", 111: "222" };
http.send(escapeParams(params));
// 応答結果表示
WScript.Echo(http.status + ":" + http.statusText);
WScript.Echo(http.getAllResponseHeaders());
WScript.Echo(http.responseText);
} catch (e) {
// エラーの場合
WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
}
function escapeParams(params) {
var param = "";
// パラメータ数分ループ
for (var key in params) {
// 連結チェック
if (param.length > 0) {
param += "&";
}
// パラメータ設定
param += encodeURIComponent(key).split("%20").join("+")
+ "=" + encodeURIComponent(params[key]).split("%20").join("+");
}
return param;
}
タイムアウト
タイムアウト値は、「setTimeouts」メソッドで設定します。
設置値の単位は全てミリ秒となっています。
タイムアウトが発生するとErrorとなります。
「setTimeouts」メソッドの引数は以下となります。
引数 | 名前 | 説明 |
---|---|---|
1 | resolveTimeout | 名前解決までのタイムアウト値、デフォルト無限 |
2 | connectTimeout | 接続タイムアウト値、デフォルト60秒 |
3 | sendTimeout | パラメータ送信タイムアウト値、デフォルト30秒 |
4 | receiveTimeout | パラメータ受信タイムアウト値、デフォルト30秒 |
「0」を設定すると無限に待つっぽいです。
try {
// 「ServerXMLHTTP」オブジェクト生成
var http = new ActiveXObject("Msxml2.ServerXMLHTTP");
// 要求初期化
http.open("GET", "http://xxx.xxx.xxx.xxx/yyyyy/", false);
// タイムアウト値設定
http.setTimeouts(0, 60 * 1000, 30 * 1000, 30 * 1000);
// 要求
http.send();
// 応答結果表示
WScript.Echo(http.status + ":" + http.statusText);
WScript.Echo(http.getAllResponseHeaders());
WScript.Echo(http.responseText);
} catch (e) {
// エラーの場合
WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
}
Errorでタイムアウト判定が嫌だという場合は、要求を非同期にして、「waitForResponse」メソッドによるタイムアウト待ちをする方法があります。
サンプルコードでは、「readyState」が完了(4)以外の場合、「waitForResponse」メソッドで応答待ちをします。
引数にはタイムアウトを設定できます。ただし、単位が秒なので気をつけて下さい。
また、これは上記の「setTimeouts」も適用されている状態なので、「receiveTimeout」より長い時間を設定した場合
さきに「setTimeouts」のタイムアウトが発生してしまうので注意してください。
try {
// 「ServerXMLHTTP」オブジェクト生成
var http = new ActiveXObject("Msxml2.ServerXMLHTTP");
// 要求初期化
http.open("GET", "http://xxx.xxx.xxx.xxx/yyyyy/", true);
// 要求
http.send();
// 応答ステータスチェック
if (http.readyState != 4) {
// 応答待機
http.waitForResponse(10);
}
// 応答ステータスチェック
if (http.readyState == 4) {
// 応答結果表示
WScript.Echo(http.status + ":" + http.statusText);
WScript.Echo(http.getAllResponseHeaders());
WScript.Echo(http.responseText);
} else {
// 要求キャンセル
http.abort();
// タイムアウト
WScript.Echo("Timeout");
}
} catch (e) {
// エラーの場合
WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
}
Proxy
Proxyは、バージョン6.0から利用できるようです。したがって、ActiveXObject生成時に6.0を指定します。
「setProxy」メソッドの引数は以下となります。
引数 | 名前 | 説明 |
---|---|---|
1 | proxySetting | 「0」前回を利用又は、自動、「1」HTTP、HTTPSは直接接続、「2」Proxyを利用して接続 |
2 | ProxyServer | Proxyサーバ |
3 | BypassList | Proxy適用外のリスト |
引数1の「proxySetting」は「2」以外の挙動についてはよくわかりませんでした。
try {
// 「ServerXMLHTTP」オブジェクト生成
var http = new ActiveXObject("Msxml2.ServerXMLHTTP.6.0");
// 要求初期化
http.open("GET", "http://xxx.xxx.xxx.xxx/yyyyy/", false);
// プロクシ設定
http.setProxy("2", "xxx.xxx.xxx.xxx:yyyy", "localhost");
// 要求
http.send();
// 応答結果表示
WScript.Echo(http.status + ":" + http.statusText);
WScript.Echo(http.getAllResponseHeaders());
WScript.Echo(http.responseText);
} catch (e) {
// エラーの場合
WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
}
Proxy認証が必要な場合「setProxyCredentials」メソッドで設定できるようです。
実際に試せる環境がなかったので、このメソッドについては検証してません。
したがって、サンプルコードはありません。