WebRequest

A função envia uma solicitação HTTP para um servidor especificado. A função possui duas versões:

1. Enviando solicitações simples do tipo "key = value" usando o cabeçalho Content-Type: application/x-www-form-urlencoded.

int  WebRequest(
   const string      method,           // método HTTP 
   const string      url,              // URL
   const string      cookie,           // cookie
   const string      referer,          // referer
   int               timeout,          // tempo esgotado
   const char        &data[],          // A matriz do corpo da mensagem HTTP
   int               data_size,        // tamanho do array data[] em bytes
   char              &result[],        // Uma matriz contendo dados de resposta do servidor
   string            &result_headers   // cabeçalhos de resposta do servidor
   );

2. Enviando uma solicitação de qualquer tipo especificando o conjunto personalizado de cabeçalhos para uma interação mais flexível com vários serviços da Web.

int  WebRequest(
   const string      method,           // método HTTP
   const string      url,              // URL
   const string      headers,          // cabeçalho 
   int               timeout,          // tempo esgotado
   const char        &data[],          // A matriz do corpo da mensagem HTTP
   char              &result[],        // Uma matriz contendo dados de resposta do servidor
   string            &result_headers   // cabeçalhos de resposta do servidor
   );

Parâmetros

método

[in]  método HTTP.

url

[in]  URL.

cabeçalho

[in]  Cabeçalhos de solicitação do tipo "key: valor", separados por uma quebra de linha "\r\n".

cookie

[in]  Valor do cookie.

referer

[in]  Valor do cabeçalho Referer do pedido HTTP.

timeout

[in]  Tempo limite em milissegundos.

data[]

[in]  Matriz de dados do corpo da mensagem HTTP.

data_size

[in]  Tamanho do array data[].

result[]

[out]  Um array contendo dados de resposta do servidor.

result_headers

[out] Cabeçalhos de resposta do servidor.

Valor retornado

Código de resposta do servidor HTTP ou -1 para um erro.

Nota

Para usar a função WebRequest(), adicione os endereços dos servidores necessários na lista de URLs permitidos na guia "Expert Advisors" da janela "Options". A porta do servidor é automaticamente selecionada com base no protocolo especificado - 80 para "http://" e 443 para "https://".

A função WebRequest() é síncrona, o que significa que interrompe a execução do programa e aguarda a resposta do servidor solicitado. Uma vez que os atrasos na recepção de uma resposta podem ser grandes, a função não está disponível para chamadas a partir dos indicadores, porque os indicadores são executados em uma linha comum compartilhada por todos os indicadores e gráficos em um símbolo. O atraso de desempenho do indicador em um dos gráficos de um símbolo pode interromper a atualização de todos os gráficos do mesmo símbolo.

A função pode ser chamada somente de Expert Advisors e scripts, como eles executam em seus próprios tópicos de execução. Se você tentar chamar a função de um indicador, GetLastError() retornará o erro 4014 — "Função não é permitida".

O WebRequest() não pode ser executada no Testador de Estratégia.

Um exemplo de usar a primeira versão da função WebRequest():

void OnStart()
  {
   string cookie=NULL,headers;
   char   post[],result[];
   string url="https://finance.yahoo.com";
//--- para trabalhar com o servidor é necessário adicionar a URL "https://finance.yahoo.com"
//--- na lista de URLs permitidas (menu Principal->Ferramentas->Opções, guia "Experts"):
//--- redefinimos o código do último erro
   ResetLastError();
//--- download da página html do Yahoo Finance
   int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
   if(res==-1)
     {
      Print("Erro no WebRequest. Código de erro =",GetLastError());
      //--- é possível que a URL não esteja na lista, exibimos uma mensagem sobre a necessidade de adicioná-la
      MessageBox("É necessário adicionar um endereço '"+url+"' à lista de URL permitidas na guia 'Experts'","Erro",MB_ICONINFORMATION);
     }
   else
     {
      if(res==200)
        {
         //--- download bem-sucedido
         PrintFormat("O arquivo foi baixado com sucesso, tamanho %d bytes.",ArraySize(result));
         //PrintFormat("Cabeçalhos do servidor: %s",headers);
         //--- salvamos os dados em um arquivo
         int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
            //--- armazenamos o conteúdo do array result[] no arquivo
            FileWriteArray(filehandle,result,0,ArraySize(result));
            //--- fechamos o arquivo
            FileClose(filehandle);
           }
         else
            Print("Erro em FileOpen. Código de erro =",GetLastError());
        }
      else
         PrintFormat("Erro de download '%s', código %d",url,res);
     }
  }