Compartir a través de


Recuperación de datos mediante script

En este tema se incluye un ejemplo de cómo escribir un script que obtiene datos a través de servicios HTTP de Microsoft Windows (WinHTTP) de forma sincrónica o asincrónica. Los conceptos que se muestran en este ejemplo proporcionan la base para escribir aplicaciones de servidor de cliente o de nivel intermedio que requieren acceso a los datos mediante el protocolo HTTP.

Requisitos previos y requisitos

Además de un conocimiento práctico de Microsoft JScript, este ejemplo requiere lo siguiente:

  • La versión actual del Kit de desarrollo de software (SDK) de Microsoft Windows.
  • La herramienta de configuración de proxy para establecer la configuración de proxy para los Servicios HTTP de Microsoft Windows (WinHTTP), si la conexión a Internet se realiza a través de un servidor proxy. Para obtener más información, consulte ProxyCfg.exe, una herramienta de configuración de proxy.
  • Familiaridad con la terminología y los conceptos de la red .

Recuperar datos de forma sincrónica

Para crear un script que obtenga el texto de una página web de forma sincrónica, haga lo siguiente:

  1. Abra un editor de texto.

  2. Copie el código siguiente en el editor de texto.

    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. Guarde el archivo como "Retrieve.js".

  4. En un símbolo del sistema, escriba "cscript Retrieve.js" y presione ENTRAR.

Ahora tiene un script que usa un objeto WinHttpRequest para obtener el código fuente HTML de la página web en https://www.microsoft.com. Es posible que tenga que esperar varios segundos para que aparezca el código.

La aplicación solo contiene una función, "getText". La primera línea del script crea el objeto WinHttpRequest .

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

Cuando el motor de JScript encuentra esta línea, crea una instancia de este objeto. Si recibe el mensaje de error "El componente ActiveX no puede crear objeto", en esta línea, lo más probable es que el WinHttp.dll no se haya registrado correctamente o no esté presente en el sistema.

La siguiente línea del script llama al método Open .

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

Tres parámetros especifican qué verbo HTTP se va a usar, el nombre del recurso y si se debe usar WinHTTP de forma sincrónica o asincrónica. En este ejemplo, el método usa el verbo HTTP"GET" para obtener datos de https://www.microsoft.com. Si se especifica FALSE para el último parámetro, se determina que la transacción se produce de forma sincrónica. El método Open no establece una conexión con el recurso, ya que el nombre podría implicar. En su lugar, inicializa las estructuras de datos internas que mantienen información sobre la sesión, la conexión y la solicitud.

El método Send ensambla los encabezados de solicitud y envía la solicitud. Cuando se llama en modo sincrónico, el método Send también espera una respuesta antes de permitir que la aplicación continúe.

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

Después de enviar la solicitud, el script devuelve el valor de la propiedad ResponseText del objeto WinHttpRequest . Esta propiedad contiene el cuerpo de entidad de la respuesta, en este caso, el origen de un documento.

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

La ejecución del script se detiene mientras se recupera todo el texto del recurso. El texto del recurso se devuelve de la función y se muestra.

El objeto WinHttpRequest garantiza que se liberen los recursos internos asignados para la transacción HTTP.

Recuperar datos de forma asincrónica

Recuperar datos de forma asincrónica mediante WinHTTP es muy similar a recuperar datos de forma sincrónica. Modifique el script de la sección anterior realizando dos pequeños cambios.

  1. Establezca el tercer parámetro del método Open en "true" en lugar de "false" para especificar que los métodos WinHTTP se deben realizar de forma asincrónica.

       //  Create a HTTP request.
        var temp = WinHttpReq.Open("GET", strURL, true);
    
  2. Invoque el método WaitForResponse antes de tener acceso a la propiedad ResponseText para asegurarse de que se ha recibido toda la respuesta.

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

La principal ventaja de usar WinHTTP de forma asincrónica en el script es que el método Send devuelve inmediatamente. La solicitud está preparada y enviada por un subproceso de trabajo. Esto permite a la aplicación hacer otras cosas mientras está esperando la respuesta. Antes de intentar acceder a la respuesta, asegúrese de que se ha recibido toda la respuesta llamando al método WaitForResponse . De lo contrario, se puede producir un error.

El método WaitForResponse también se puede usar para especificar un valor de tiempo de espera para la transacción. Un parámetro opcional permite especificar el valor de tiempo de espera en segundos.

WinHttpRequest

HTTP/1.1 Solicitud de comentarios (RFC 2616)