Descargar MetaTrader 5

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 del uso de la 1-ra variante de la función WebRequest():

void OnStart()
  {
   string cookie=NULL,headers;
   char post[],result[];
   int res;
//--- para poder trabajar con el servidor, añadir URL "https://www.google.com/finance"
//--- en la lista de las URLs permitidas (Menú principal -> Herramientas -> Ajustes, pestaña "Asesores Expertos"):
   string google_url="https://www.google.com/finance";
//--- anulamos el código del último error
   ResetLastError();
//--- cargando la página html desde Google Finance
   int timeout=5000; //--- timeout menos de 1000 (1 seg.) no es suficiente si la velocidad de Internet es baja
   res=WebRequest("GET",google_url,cookie,NULL,timeout,post,0,result,headers);
//--- comprobación de errores
   if(res==-1)
     {
      Print("Error en WebRequest. Código del error  =",GetLastError());
      //--- puede que la URL no esté en la lista, mostramos el mensaje sobre la necesidad de su inserción
      MessageBox("Hay que añadir la dirección '"+google_url+"' en la lista de las URLs permitidas en la pestaña 'Asesores Expertos'","Error",MB_ICONINFORMATION);
     }
   else
     {
      //--- cargado con éxito
      PrintFormat("Archivo cargado con éxito, Tamaño del archivo =%d bytes.",ArraySize(result));
      //--- guardamos los datos en el archivo
      int filehandle=FileOpen("GoogleFinance.htm",FILE_WRITE|FILE_BIN);
      //--- comprobación del error
      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 del error =",GetLastError());
     }
  }

 

Ejemplo del uso de la 2-da variante de la función WebRequest():

#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
#property description "Ejemplo del script que publica el mensaje "
#property description "del usuario en la lista de noticias en mql5.com"
 
input string InpLogin   ="";             //Su cuenta en MQL5.com
input string InpPassword="";             //Contraseña de su cuenta
input string InpFileName="EURUSDM5.png"//Imagen en la carpeta MQL5/Files/
input string InpFileType="image/png";    //mime type correcto de la imagen
//+------------------------------------------------------------------+
//| Publicación del mensaje con imagen en la lista de noticias de mql5.com                |
//+------------------------------------------------------------------+
bool PostToNewsFeed(string login,string password,string text,string filename,string filetype)
  {
   int    res;     // para la colocación del resultado de ejecución de la operación
   char   data[];  // array con datos para el envío de las solicitudes POST
   char   file[];  // aquí leemos la imagen
   string str="Login="+login+"&Password="+password;
   string auth,sep="-------Jyecslin9mp8RdKV"// separador de datos del formato multipart
//--- tenemos un archivo - intentamos leerlo
   if(filename!=NULL && filename!="")
     {
      res=FileOpen(filename,FILE_READ|FILE_BIN);
      if(res<0)
        {
         Print("Error de apertura del archivo \""+filename+"\"");
         return(false);
        }
      //--- leemos los datos del archivo
      if(FileReadArray(res,file)!=FileSize(res))
        {
         FileClose(res);
         Print("Error de lectura del archivo \""+filename+"\"");
         return(false);
        }
      //---
      FileClose(res);
     }
//--- formamos el cuerpo de la solicitud POST para la autorización
   ArrayResize(data,StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8)-1);
//--- actualizaremos el código del error
   ResetLastError();
//--- ejecutamos la solicitud para la autorización
   res=WebRequest("POST","https://www.mql5.com/ru/auth_login",NULL,0,data,data,str);
//--- si la autorización ha fallado
   if(res!=200)
     {
      Print("Error de autorización #"+(string)res+", LastError="+(string)GetLastError());
      return(false);
     }
//--- leemos cookie de autorización en el encabezado de la respuesta del servidor
   res=StringFind(str,"Set-Cookie: auth=");
//--- si cookie no encontrada - avisamos sobre el error
   if(res<0)
     {
      Print("Error, los datos de la autorización no han sido encontrados en la respuesta del servidor (comprobar login/contraseña)");
      return(false);
     }
//--- recordamos los datos de la autorización y formamos el encabezado para las siguientes solicitudes
   auth=StringSubstr(str,res+12);
   auth="Cookie: "+StringSubstr(auth,0,StringFind(auth,";")+1)+"\r\n";
//--- si tenemos el archivo de datos - lo enviamos al servidor
   if(ArraySize(file)!=0)
     {
      //--- formamos el cuerpo de la solicitud
      str="--"+sep+"\r\n";
      str+="Content-Disposition: form-data; name=\"attachedFile_imagesLoader\"; filename=\""+filename+"\"\r\n";
      str+="Content-Type: "+filetype+"\r\n\r\n";
      res =StringToCharArray(str,data);
      res+=ArrayCopy(data,file,res-1,0);
      res+=StringToCharArray("\r\n--"+sep+"--\r\n",data,res-1);
      ArrayResize(data,ArraySize(data)-1);
      //--- formamos el encabezado de la solicitud
      str=auth+"Content-Type: multipart/form-data; boundary="+sep+"\r\n";
      //--- actualizaremos el código del error
      ResetLastError();
      //--- ejecutamos la solicitud para el envío del archivo de la imagen al servidor
      res=WebRequest("POST","https://www.mql5.com/upload_file",str,0,data,data,str);
      //--- comprobamos el resultado
      if(res!=200)
        {
         Print("Error del envío del archivo al servidor #"+(string)res+", LastError="+(string)GetLastError());
         return(false);
        }
      //--- obtenemos el enlace a la imagen cargada en el servidor
      str=CharArrayToString(data);
      if(StringFind(str,"{\"Url\":\"")==0)
        {
         res     =StringFind(str,"\"",8);
         filename=StringSubstr(str,8,res-8);
         //--- en caso del error de la carga del archivo, devolverá un enlace vacío
         if(filename=="")
           {
            Print("Fallo al enviar el archivo el servidor");
            return(false);
           }
        }
     }
//--- formamos el cuerpo de la solicitud de la publicación del mensaje en el servidor
   str ="--"+sep+"\r\n";
   str+="Content-Disposition: form-data; name=\"content\"\r\n\r\n";
   str+=text+"\r\n";
//--- en qué idiomas del sitio mql5.com estará disponible la publicación
   str+="--"+sep+"\r\n";
   str+="Content-Disposition: form-data; name=\"AllLanguages\"\r\n\r\n";
   str+="on\r\n";
//--- si la imagen ha sido cargada en el servidor, enviamos el enlace a ella
   if(ArraySize(file)!=0)
     {
      str+="--"+sep+"\r\n";
      str+="Content-Disposition: form-data; name=\"attachedImage_0\"\r\n\r\n";
      str+=filename+"\r\n";
     }
//--- la línea final de la solicitud multipart
   str+="--"+sep+"--\r\n";
//--- reunimos el cuerpo de la solicitud POST en una línea
   StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8);
   ArrayResize(data,ArraySize(data)-1);
//--- preparamos el encabezado de la solicitud  
   str=auth+"Content-Type: multipart/form-data; boundary="+sep+"\r\n";
//--- ejecutamos la solicitud para la publicación del mensaje en la lista de noticias del usuario de mql5.com
   res=WebRequest("POST","https://www.mql5.com/ru/users/"+login+"/wall",str,0,data,data,str);
//--- en caso de la publicación exitosa devolvemos true
   return(res==200);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- posteamos el mensaje con imagen en mql5.com, cogemos la ruta de la imagen desde el parámetro InpFileName
   PostToNewsFeed(InpLogin,InpPassword,"Comprobación de la versión ampliada de la función WebRequest\r\n"
                  "(Este mensaje ha sido colocado por el script WebRequest.mq5)",InpFileName,InpFileType);
  }
//+------------------------------------------------------------------+

 


Actualizado: 2015.12.25