スクリプトを使用したデータの取得

このトピックでは、Microsoft Windows HTTP Services (WinHTTP) を使用してデータを同期または非同期で取得するスクリプトを記述する方法の例について説明します。 この例で示す概念は、HTTP プロトコルを使用してデータへのアクセスを必要とするクライアントまたは中間層のサーバー アプリケーションを記述するための基礎を提供します。

前提条件と要件

この例では、Microsoft JScript に関する実用的な知識に加えて、次のものが必要です。

  • Microsoft Windows Software Development Kit (SDK) の現在のバージョン。
  • インターネットへの接続がプロキシ サーバーを介している場合に、Microsoft Windows HTTP Services (WinHTTP) のプロキシ設定を確立するためのプロキシ構成ツール。 詳細については、「 プロキシ構成ツールProxyCfg.exe」を参照してください。
  • ネットワークの用語と概念に関する知識。

同期的にデータを取得する

Web ページからテキストを同期的に取得するスクリプトを作成するには、次の操作を行います。

  1. テキスト エディターを開きます。

  2. 次のコードをテキスト エディターにコピーします。

    function getText(strURL)
    {
        var strResult;
    
        try
        {
            // Create the WinHTTPRequest ActiveX Object.
            var WinHttpReq = new ActiveXObject(
                                      "WinHttp.WinHttpRequest.5.1");
    
            //  Create an HTTP request.
            var temp = WinHttpReq.Open("GET", strURL, false);
    
            //  Send the HTTP request.
            WinHttpReq.Send();
    
            //  Retrieve the response text.
            strResult = WinHttpReq.ResponseText;
        }
        catch (objError)
        {
            strResult = objError + "\n"
            strResult += "WinHTTP returned error: " + 
                (objError.number & 0xFFFF).toString() + "\n\n";
            strResult += objError.description;
        }
    
        //  Return the response text.
        return strResult;
    }
    
    WScript.Echo(getText("https://www.microsoft.com/default.htm"));
    
  3. ファイルを "Retrieve.js" として保存します。

  4. コマンド プロンプトで「cscript Retrieve.js」と入力し、Enter キーを押します。

WinHttpRequest オブジェクトを使用して Web ページhttps://www.microsoft.comの HTML ソース コードを取得するスクリプトが作成されました。 コードが表示されるまで数秒待つ必要がある場合があります。

アプリケーションには、"getText" という関数が 1 つだけ含まれています。 スクリプトの最初の行は 、WinHttpRequest オブジェクトを 作成します。

    // Create the WinHTTPRequest ActiveX Object.
    var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");

JScript エンジンはこの行を検出すると、このオブジェクトのインスタンスを作成します。 "ActiveX コンポーネントでオブジェクトを作成できません" というエラー メッセージが表示された場合、この行では、WinHttp.dllが正しく登録されていないか、システムに存在しない可能性が高くなります。

スクリプトの次の行は Open メソッドを呼び出します。

    //  Create an HTTP request.
    WinHttpReq.Open("GET", "https://www.microsoft.com", false);

3 つのパラメーターは、使用する HTTP 動詞 、リソースの名前、および WinHTTP を同期的または非同期的に使用するかどうかを指定します。 この例では、 メソッドは HTTP 動詞 "GET" を使用して から https://www.microsoft.comデータを取得しています。 最後のパラメーターに FALSE を 指定すると、トランザクションが同期的に実行されます。 Open メソッドは、名前が示す可能性があるため、リソースへの接続を確立しません。 むしろ、セッション、接続、および要求に関する情報を保持する内部データ構造を初期化します。

Send メソッドは要求ヘッダーをアセンブルし、要求を送信します。 同期モードで呼び出されると、 Send メソッドは応答を待機してから、アプリケーションを続行できるようにします。

    // Send the HTTP request.
    WinHttpReq.Send();

要求を送信すると、スクリプトは WinHttpRequest オブジェクトの ResponseText プロパティの値を返します。 このプロパティには、応答のエンティティ本文 (この場合はドキュメントのソース) が含まれます。

    // Get the response text.
    return WinHttpReq.ResponseText;

リソースのテキスト全体が取得されている間、スクリプトの実行は一時停止します。 リソース テキストが関数から返され、表示されます。

WinHttpRequest オブジェクトを使用すると、HTTP トランザクションに割り当てられている内部リソースが解放されます。

非同期的にデータを取得する

WinHTTP を使用して非同期的にデータを取得することは、同期的にデータを取得するのと非常によく似ています。 2 つの小さな変更を行って、前のセクションのスクリプトを変更します。

  1. WinHTTP メソッドを非同期に実行するように指定するには、 Open メソッドの 3 番目のパラメーターを "false" ではなく "true" に設定します。

       //  Create a HTTP request.
        var temp = WinHttpReq.Open("GET", strURL, true);
    
  2. ResponseText プロパティにアクセスする前に WaitForResponse メソッドを呼び出して、応答全体が受信されたことを確認します。

        //  Send the HTTP request.
        WinHttpReq.Send();
    
        // Wait for the entire response.
        WinHttpReq.WaitForResponse();
    
        //  Retrieve the response text.
        strResult = WinHttpReq.ResponseText;
    

スクリプトで WinHTTP を非同期的に使用するメインの利点は、Send メソッドがすぐに返される点です。 要求は準備され、ワーカー スレッドによって送信されます。 これにより、アプリケーションは応答を待機している間に他の操作を実行できます。 応答にアクセスする前に、 WaitForResponse メソッドを呼び出して、応答全体が受信されていることを確認します。 そうしないと、エラーが発生する可能性があります。

WaitForResponse メソッドを使用して、トランザクションのタイムアウト値を指定することもできます。 省略可能なパラメーターを使用すると、タイムアウト値を秒単位で指定できます。

WinHttpRequest

HTTP/1.1 コメントの要求 (RFC 2616)