Tâche : mise en œuvre de l'analyse quotidienne dans MQL5 avec affichage en ligne - page 7

 
Quelqu'un a-t-il des exemples d'utilisation de cette fonction, le manuel est muet sur le sujet !
 
IvanIvanov:
Quelqu'un a-t-il des exemples d'utilisation de cette fonction car le manuel est muet sur ce sujet !

Comment est-il silencieux, tout est expliqué ici.

Il y a des exemples de WinInet dans le code de bezet, et il y a aussi des exemples fonctionnels et testés.

void OnStart()
  {
   string cookie=NULL,headers;
   char post[],result[];
   int res;
//--- для работы с сервером необходимо добавить URL "https://www.google.com/finance" 
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
   string google_url="https://www.google.com/finance";
//--- обнуляем код последней ошибки
   ResetLastError();
//--- загрузка html-страницы с Google Finance
   res=WebRequest("GET",google_url,cookie,NULL,50,post,0,result,headers);
//--- проверка ошибок
   if(res==-1)
     {
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //--- возможно URL отсутствует в списке, выводим сообщение о необходимости его добавления
      MessageBox("Необходимо добавить адрес '"+google_url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }
   else
     {
      //--- успешная загрузка
      PrintFormat("Файл успешно загружен, Размер файла =%d байт.",ArraySize(result));
      //--- сохраняем данные в файл
      int filehandle=FileOpen("GoogleFinance.htm",FILE_WRITE|FILE_BIN);
      //--- проверка ошибки
      if(filehandle!=INVALID_HANDLE)
        {
         //--- сохраняем содержимое массива result[] в файл
         FileWriteArray(filehandle,result,0,ArraySize(result));
         //--- закрываем файл
         FileClose(filehandle);
        }
      else Print("Ошибка в FileOpen. Код ошибки =",GetLastError());
     }
  }
 


 
sanyooooook:

comment c'est silencieux, tout est écrit.

Enfin, pas tout. Renat a dit

On peut tout faire avec...

Existe-t-il un exemple de demande POST écrit dans l'aide ? Ou le téléchargement de fichiers ?

 
fyords:

Enfin, pas tous. Renat a dit

Existe-t-il un exemple de demande POST écrit dans l'aide ? Ou le téléchargement de fichiers ?

S'il est indiqué GET, cela signifie GET-request, s'il est indiqué POST, alors POST-request (avec POST-request, plus de paramètres de requête peuvent être envoyés).

Dans la variable résultat est écrit ce qui est sur le lien :

https://www.google.com/finance

Ensuite, le résultat est écrit dans un fichier et le fichier est ouvert à l'écriture comme un fichier binaire.

ZS : cherchez dans la base de code des exemples de WinInet, c'est la même chose ici.

 
sanyooooook:

S'il est indiqué GET, alors GET-request, s'il est indiqué POST, alors POST-request (avec POST-request, les paramètres de la demande peuvent également être envoyés).

dans la variable résultat est écrit ce qui est via lien :

après que le résultat soit écrit dans le fichier, le fichier est ouvert pour l'écriture en tant que binaire.

Je comprends bien que l'aide n'est pas un exemple.
Ensuite, je m'intéresse au chargement de données non textuelles par requête POST.

Demandes de traceroute, toujours transmises dans l'en-tête.

Content-Type: application/x-www-form-urlencoded

Bien que le téléchargement de l'image semble nécessiter

Content-Type: multipart/form-data;
Content-Type: image/jpeg
 

J'avais l'habitude de le faire comme ça, mais ce n'est pas bien et ce n'est pas fait pour s'adapter à l'image :

//+------------------------------------------------------------------+
//|                                                     HttpPOST.mq4 |
//|                      Copyright © 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#define  INTERNET_FLAG_PRAGMA_NOCACHE                                            0x00000100  // не кешировать страницу
#define  INTERNET_FLAG_KEEP_CONNECTION                                           0x00400000  // не разрывать соединение
#define  INTERNET_FLAG_SECURE                                            0x00800000 
#define  INTERNET_FLAG_RELOAD                                                                            0x80000000  // получать страницу с сервера при обращении к ней
#define  INTERNET_OPEN_TYPE_PRECONFIG  0   // use registry configuration
#define  INTERNET_FLAG_KEEP_CONNECTION   0x00400000  // use keep-alive semantics
#define  INTERNET_SERVICE_HTTP   3

#import "wininet.dll"
        int InternetAttemptConnect(int x);
  int InternetOpenA(string sAgent, int lAccessType, string sProxyName="", string sProxyBypass="", int lFlags = 0);
        int InternetConnectA(int hInternet, string lpszServerName, /*WORD*/ int nServerPort, string lpszUsername, string lpszPassword, int dwService, int dwFlags,  int dwContext);
  int HttpOpenRequestA(int hConnect, string lpszVerb, string lpszObjectName, string lpszVersion, string lpszReferer, string lplpszAcceptTypes, int dwFlags, int dwContext);
  int HttpSendRequestA(int hRequest, string lpszHeaders, int dwHeadersLength, int& lpOptional[], int dwOptionalLength);
  int InternetCloseHandle(int hInet);
//  int InternetReadFile(int hFile, int& sBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[]);
int InternetReadFile(int hFile, string sBuffer, int lNumBytesToRead, int& lNumberOfBytesRead[]);
#import
        
        string Host="secure.indx.ru";
        string Path="/api/v1/tradejson.asmx";
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
        int h=FileOpen("text.txt", FILE_BIN|FILE_READ); if (h<0) return;
        FileSeek(h, 0, SEEK_SET);       int size=MathFloor(FileSize(h)/4);if(FileSize(h)%4!=0)size++;
        int data[], i=0;        ArrayResize(data, size); // изменили размер
        while (!FileIsEnding(h)) { data[i]=FileReadInteger(h, LONG_VALUE); i++; }
        FileClose(h); // 
        // выводим прочитанный массив для проверки
        string st="";
        for (i=0; i<size; i++) 
        {
                st=st+CharToStr(data[i]&255); st=st+CharToStr(data[i]>>8&255); 
                st=st+CharToStr(data[i]>>16&255); st=st+CharToStr(data[i]>>24&255); 
        }
        Print("Размер файла: "+size*4+"  байт");
        Print("Данные: "+st);
        int hInternetSession, hConnectHandle, hResourceHandle, result;
        if(InternetAttemptConnect(0)!=0) { Print("error InternetAttemptConnect"); return(0); }
        hInternetSession=InternetOpenA("Microsoft Internet Explorer",  INTERNET_OPEN_TYPE_PRECONFIG, "", "", 0); 
        if (hInternetSession<=0) { Print("error InternetOpenA()"); return(0); }
        
        hConnectHandle=InternetConnectA(hInternetSession, Host, 80, "", "", INTERNET_SERVICE_HTTP, 0, 0); 
        if (hConnectHandle<=0) { Print("error InternetConnect()"); return(0); }
        
        hResourceHandle=HttpOpenRequestA(hConnectHandle, 
                                         "POST", 
                                         Path, 
                                         "", 
                                         "", 
                                         "Accept: text/json\r\n", 
                                         INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE, 
                                         0); 
        if (hResourceHandle<=0) { Print("error HttpOpenRequest()"); return(0); }
        Print(hResourceHandle);
        string Head="Content-Type: application/x-www-form-urlencoded";
   int Len=StringLen(Head);
        result=HttpSendRequestA(hResourceHandle, Head, Len, data, size);
        Print(result);
        if (result<=0) { Print("error HttpSendRequestA()"); return(0); }
        //Print("Сука вот я дебил!!! )))");
  int     lReturn[]  = {1};
  string  sBuffer    = "";
  string strWebPage="";
  int I=0;
  while (!IsStopped()) {
    if (InternetReadFile(hResourceHandle, sBuffer, 128, lReturn) <= 0 || lReturn[0] == 0) {
    //Print(sBuffer);
      break;
    }
    I++;
    Print(I);
    strWebPage = StringConcatenate(strWebPage, StringSubstr(sBuffer, 0, lReturn[0]));
  }
    Print(strWebPage);
   InternetCloseHandle(hResourceHandle);
        InternetCloseHandle(hConnectHandle);
        InternetCloseHandle(hInternetSession);     
   return(0);
  }
//+------------------------------------------------------------------+
 

Non, vous pouvez faire n'importe quoi avec une DLL.
Merci pour l'exemple.

Je suis intéressé par les outils réguliers, WebRequest.

 
fyords:

Non, vous pouvez faire n'importe quoi avec une DLL.

Je suis intéressé par les outils réguliers, WebRequest.

Par analogie avec l'utilisation de WinInet, je comprends que vous avez simplement un problème avec le bon en-tête.
 
sanyooooook:
faire la même chose qu'avec WinInet, je comprends que vous avez juste un problème avec l'en-tête qui est correct.
Non, le problème est que WebRequest ne permet pas (peut-être que je ne sais pas comment) de générer ses propres en-têtes.
 
Où voulez-vous poster ?