Поделиться через


Получение данных с помощью скрипта

В этом разделе приведен пример создания скрипта, который получает данные через службы Microsoft Windows HTTP (WinHTTP) синхронно или асинхронно. Концепции, продемонстрированные в этом примере, обеспечивают основу для написания клиентских или серверных приложений среднего уровня, которым требуется доступ к данным по протоколу HTTP.

Предварительные требования и требования

Помимо рабочих знаний о Microsoft JScript, в этом примере требуется следующее:

  • Текущая версия пакета sdk для Microsoft Windows.
  • Средство настройки прокси-сервера для установки параметров прокси-сервера для служб HTTP Microsoft Windows (WinHTTP), если подключение к Интернету осуществляется через прокси-сервер. Дополнительные сведения см. в разделе ProxyCfg.exe, средство настройки прокси-сервера.
  • Знакомство с сетевой терминологией и основными понятиями.

Синхронный получение данных

Чтобы создать скрипт, который синхронно получает текст с веб-страницы, сделайте следующее:

  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" и нажмите клавишу ВВОД.

Теперь у вас есть скрипт, использующий объект WinHttpRequest для получения исходного кода HTML для веб-страницы по адресу https://www.microsoft.com. Может потребоваться подождать несколько секунд, пока код не появится.

Приложение содержит только одну функцию getText. В первой строке скрипта создается объект 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);

Три параметра определяют, какую HTTP-команду следует использовать, имя ресурса и использовать ли WinHTTP синхронно или асинхронно. В этом примере метод использует HTTP-команду GET для получения данных из https://www.microsoft.com. Если задать значение FALSE для последнего параметра, транзакция выполняется синхронно. Метод Open не устанавливает подключение к ресурсу, как это может означать имя. Вместо этого она инициализирует внутренние структуры данных, которые содержат сведения о сеансе, подключении и запросе.

Метод Send собирает заголовки запроса и отправляет запрос. При вызове в синхронном режиме метод Send также ожидает ответа, прежде чем позволить приложению продолжить работу.

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

После отправки запроса скрипт возвращает значение свойства ResponseText объекта WinHttpRequest . Это свойство содержит тело сущности ответа, в данном случае — источник документа.

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

Выполнение скрипта приостанавливается, пока извлекается весь текст ресурса. Текст ресурса возвращается из функции и отображается.

Объект WinHttpRequest гарантирует освобождение всех внутренних ресурсов, выделенных для http-транзакции.

Асинхронный получение данных

Асинхронное извлечение данных с помощью WinHTTP очень похоже на синхронное извлечение данных. Измените скрипт из предыдущего раздела, внося два небольших изменения.

  1. Присвойте третьему параметру метода Open значение true, а не false, чтобы указать, что методы WinHTTP должны выполняться асинхронно.

       //  Create a HTTP request.
        var temp = WinHttpReq.Open("GET", strURL, true);
    
  2. Вызовите метод WaitForResponse перед доступом к свойству ResponseText , чтобы убедиться, что весь ответ получен.

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

Преимуществом main асинхронного использования WinHTTP в скрипте является то, что метод Send возвращает немедленно. Запрос подготавливается и отправляется рабочим потоком. Это позволяет приложению выполнять другие действия в ожидании ответа. Прежде чем пытаться получить доступ к ответу, убедитесь, что весь ответ получен, вызвав метод WaitForResponse . В противном случае может возникнуть ошибка.

Метод WaitForResponse также можно использовать для указания значения времени ожидания для транзакции. Необязательный параметр позволяет указать значение времени ожидания в секундах.

WinHttpRequest

Http/1.1 Request for Comments (RFC 2616)