WebRequest

Envía la solicitud HTTP al servidor especificado. Hay 2 variantes de esta función:

1. Para el envío de las solicitudes simples del tipo "clave=valor" usando el encabezado Content-Type: application/x-www-form-urlencoded.

int  WebRequest(
   const string      method,           // método HTTP 
   const string      url,              // dirección url
   const string      cookie,           // cookie
   const string      referer,          // referer
   int               timeout,          // tiempo de inactividad
   const char        &data[],          // array del cuerpo del mensaje HTTP
   int               data_size,        // tamaño del array data[] bytes
   char              &result[],        // array con los datos de respuesta del servidor
   string            &result_headers   // encabezado de la respuesta del servidor
   );

2. Para el envío de las solicitudes del tipo libre especificando el conjunto individual de encabezados para la interacción más flexible con diferentes servicios Web.

int  WebRequest(
   const string      method,           // método HTTP
   const string      url,              // dirección url
   const string      headers,          // encabezados 
   int               timeout,          // tiempo de inactividad
   const char        &data[],          // array del cuerpo del mensaje HTTP
   char              &result[],        // array con los datos de respuesta del servidor
   string            &result_headers   // encabezado de la respuesta del servidor
   );

Parámetros

method

[in]  Método HTTP.

url

[in]  Dirección URL.

headers

[in]  Encabezados de la solicitud del tipo "clave: valor" separados con salto de línea "\r\n".

cookie

[in]  Valor Cookie.

referer

[in]  Valor del encabezado de la solicitud Referer HTTP.

timeout

[in]  Tiempo de inactividad en milisegundos.

data[]

[in]  Array de datos del cuerpo del mensaje HTTP.

data_size

[in]  Tamaño del array data[].

result[]

[out]  Array con los datos de respuesta del servidor.

result_headers

[out] Encabezados de la respuesta del servidor.

Valor devuelto

Código de la respuesta del servidor HTTP, o -1 en caso del error.

Nota

Para el uso de la función WebRequest() hay que añadir las direcciones de los servidores en la lista de las URLs permitidas en la pestaña "Asesores Expertos" de la ventana "Ajustes". El puerto del servidor se selecciona automáticamente a base del protocolo especificado: 80 para "http://" y 443 para "https://".

La función WebRequest() es sincrónica. Eso significa que interrumpe la ejecución del programa y espera la respuesta del servidor solicitado. Puesto que los retardos a la hora de recibir la respuesta a la solicitud enviada pueden ser importantes, esta función está prohibida para las llamadas desde los indicadores porque los indicadores trabajan en el único flujo común para todos los indicadores y gráficos de este símbolo. El retardo de ejecución del indicador en uno de los gráficos del símbolo puede provocar la parada de las actualizaciones de todos los gráficos de este símbolo.

Esta función puede invocarse sólo desde los EAs y los scripts porque trabajan en su propio flujo de ejecución. Si la función se invoca desde un indicador, GetLastError() devolverá el error 4014 — "Función prohibida".

Durante el trabajo en el Probador de Estrategias la función WebRequest() no se ejecuta.

Ejemplo:

void OnStart()
  {
   string cookie=NULL,headers;
   char   post[],result[];
   string url="https://finance.yahoo.com";
//--- para trabajar con el servidor es necesario añadir el URL "https://finance.yahoo.com"
//--- en la lista de URL permitidos (Menú principal->Servicio->Ajustes, pestaña "Asesores"):
//--- reseteamos el código del último error
   ResetLastError();
//--- carga de la página html desde Yahoo Finance
   int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
   if(res==-1)
     {
      Print("Error en WebRequest. Código de error  =",GetLastError());
      //--- es posible que el URL no esté en la lista; mostramos un mensaje que indique que es necesario añadirlo
      MessageBox("Es necesario añadir la dirección '"+url+"' a la lista de URL permitidos en la pestaña 'Asesores'","Error",MB_ICONINFORMATION);
     }
   else
     {
      if(res==200)
        {
         //--- la carga se ha realizado con éxito
         PrintFormat("El archivo se ha cargado con éxito, tamaño %d bytes.",ArraySize(result));
         //PrintFormat("Encabezados del servidor: %s",headers);
         //--- guardamos los datos en el archivo
         int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
            //--- guardamos el contenido del array result[] en el archivo
            FileWriteArray(filehandle,result,0,ArraySize(result));
            //--- cerramos el archivo
            FileClose(filehandle);
           }
         else
            Print("Error en FileOpen. Código de error =",GetLastError());
        }
      else
         PrintFormat("Error de carga '%s', código %d",url,res);
     }
  }