WebRequest

この関数は、指定されたサーバーにHTTP要求を送信します。この関数には2つのバージョンがあります。

1. ヘッダーContent-Type:application / x-www-form-urlencodedを使用して、タイプ “key = value”の単純なリクエスト送信します

int  WebRequest(
   const string      method,           // HTTP method 
   const string      url,              // URL
   const string      cookie,           // cookie
   const string      referer,          // referer
   int               timeout,          // timeout
   const char        &data[],          // the array of the HTTP message body
   int               data_size,        // data[] array size in bytes
   char              &result[],        // an array containing server response data
   string            &result_headers   // headers of server response
   );

2. さまざまなWebサービスとのより柔軟な相互作用のために、ヘッダーのカスタムセットを指定する任意のタイプの要求を送信します。

int  WebRequest(
   const string      method,           // HTTP method
   const string      url,              // URL
   const string      headers,          // headers 
   int               timeout,          // timeout
   const char        &data[],          // the array of the HTTP message body
   char              &result[],        // an array containing server response data
   string            &result_headers   // headers of server response
   );

パラメーター

method

[入力] HTTPメソッド。

url

[入力] URL。

headers

[in]改行 “\ r \ n”で区切られた、タイプ “key:value”のリクエストヘッダー。

cookie

[in] Cookie値。

referer

[入力] HTTPリクエストのRefererヘッダーの値。

timeout

[in]ミリ秒単位のタイムアウト。

data[]

[入力] HTTPメッセージ本文のデータ配列。

data_size

[in] data []配列のサイズ。

result[]

[出力]サーバー応答データを含む配列。

result_headers

[out]サーバー応答ヘッダー。

戻り値

HTTPサーバーの応答コードまたはエラーの場合は-1。

注意

WebRequest()関数を使用するには、「オプション」ウィンドウの「エキスパートアドバイザー」タブで許可されたURLのリストに必要なサーバーのアドレスを追加します。サーバーポートは、指定されたプロトコルに基づいて自動的に選択されます-「http://」の場合は80、「https://」の場合は443。

WebRequest()関数は同期です。つまり、プログラムの実行を中断し、要求されたサーバーからの応答を待ちます。応答は1つのシンボル上のすべてのインジケーターとチャートで共有される共通のスレッドで実行されるため、応答の受信の遅延が大きくなる可能性があるため、この機能はインジケーターからの呼び出しには使用できません。シンボルのチャートのいずれかのインジケーターのパフォーマンスの遅延により、同じシンボルのすべてのチャートの更新が停止する場合があります。

この関数は、Expert Advisorとスクリプトからのみ呼び出すことができます。これらは独自の実行スレッドで実行されるためです。インディケーターから関数を呼び出そうとすると、GetLastError()はエラー4060-「関数は呼び出しを許可されていません」を返します。

Strategy TesterではWebRequest()を実行できません。

WebRequest()関数の最初のバージョンを使用する例

void OnStart()
  {
   string cookie=NULL,headers;
   char post[],result[];
   int res;
//— to enable access to the server, you should add URL “https://www.google.com/finance”
//— in the list of allowed URLs (Main Menu->Tools->Options, tab “Expert Advisors”):
   string google_url=“https://www.google.com/finance”;
//— Reset the last error code
   ResetLastError();
//— Loading a html page from Google Finance
   int timeout=5000; //— Timeout below 1000 (1 sec.) is not enough for slow Internet connection
   res=WebRequest(“GET”,google_url,cookie,NULL,timeout,post,0,result,headers);
//— Checking errors
   if(res==-1)
     {
      Print(“Error in WebRequest. Error code  =”,GetLastError());
      //— Perhaps the URL is not listed, display a message about the necessity to add the address
      MessageBox(“Add the address ‘”+google_url+“‘ in the list of allowed URLs on tab ‘Expert Advisors'”,“Error”,MB_ICONINFORMATION);
     }
   else
     {
      //— Load successfully
      PrintFormat(“The file has been successfully loaded, File size =%d bytes.”,ArraySize(result));
      //— Save the data to a file
      int filehandle=FileOpen(“GoogleFinance.htm”,FILE_WRITE|FILE_BIN);
      //— Checking errors
      if(filehandle!=INVALID_HANDLE)
        {
         //— Save the contents of the result[] array to a file
         FileWriteArray(filehandle,result,0,ArraySize(result));
         //— Close the file
         FileClose(filehandle);
        }
      else Print(“Error in FileOpen. Error code=”,GetLastError());
     }
  }

 

#property link      “https://www.mql5.com”
#property version   “1.00”
#property strict
#property script_show_inputs
#property description “Sample script posting a user message “
#property description “on the wall on mql5.com”
 
input string InpLogin   =“”;             //Your MQL5.com account
input string InpPassword=“”;             //Your account password
input string InpFileName=“EURUSDM5.png”//An image in folder MQL5/Files/
input string InpFileType=“image/png”;    //Correct mime type of the image
//+——————————————————————+
//| Posting a message with an image on the wall at mql5.com          |
//+——————————————————————+
bool PostToNewsFeed(string login,string password,string text,string filename,string filetype)
  {
   int    res;     // To receive the operation execution result
   char   data[];  // Data array to send POST requests
   char   file[];  // Read the image here
   string str=“Login=”+login+“&Password=”+password;
   string auth,sep=“——-Jyecslin9mp8RdKV”// multipart data separator
//— A file is available, try to read it
   if(filename!=NULL && filename!=“”)
     {
      res=FileOpen(filename,FILE_READ|FILE_BIN);
      if(res<0)
        {
         Print(“Error opening the file \””+filename+”\“”);
         return(false);
        }
      //— Read file data
      if(FileReadArray(res,file)!=FileSize(res))
        {
         FileClose(res);
         Print(“Error reading the file \””+filename+”\“”);
         return(false);
        }
      //—
      FileClose(res);
     }
//— Create the body of the POST request for authorization
   ArrayResize(data,StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8)-1);
//— Resetting error code
   ResetLastError();
//— Authorization request
   res=WebRequest(“POST”,“https://www.mql5.com/en/auth_login”,NULL,0,data,data,str);
//— If authorization failed
   if(res!=200)
     {
      Print(“Authorization error #”+(string)res+“, LastError=”+(string)GetLastError());
      return(false);
     }
//— Read the authorization cookie from the server response header
   res=StringFind(str,“Set-Cookie: auth=”);
//— If cookie not found, return an error
   if(res<0)
     {
      Print(“Error, authorization data not found in the server response (check login/password)”);
      return(false);
     }
//— Remember the authorization data and form the header for further requests
   auth=StringSubstr(str,res+12);
   auth=“Cookie: “+StringSubstr(auth,0,StringFind(auth,“;”)+1)+“\r\n”;
//— If there is a data file, send it to the server
   if(ArraySize(file)!=0)
     {
      //— Form the request body
      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);
      //— Form the request header
      str=auth+“Content-Type: multipart/form-data; boundary=”+sep+“\r\n”;
      //— Reset error code
      ResetLastError();
      //— Request to send an image file to the server
      res=WebRequest(“POST”,“https://www.mql5.com/upload_file”,str,0,data,data,str);
      //— check the request result
      if(res!=200)
        {
         Print(“Error sending a file to the server #”+(string)res+“, LastError=”+(string)GetLastError());
         return(false);
        }
      //— Receive a link to the image uploaded to the server
      str=CharArrayToString(data);
      if(StringFind(str,“{\”Url\“:\””)==0)
        {
         res     =StringFind(str,“\””,8);
         filename=StringSubstr(str,8,res-8);
         //— If file uploading fails, an empty link will be returned
         if(filename==“”)
           {
            Print(“File sending to server failed”);
            return(false);
           }
        }
     }
//— Create the body of a request to post an image on the server
   str =“–“+sep+“\r\n”;
   str+=“Content-Disposition: form-data; name=\”content\“\r\n\r\n”;
   str+=text+“\r\n”;
//— The languages in which the post will be available on mql5.com 
   str+=“–“+sep+“\r\n”;
   str+=“Content-Disposition: form-data; name=\”AllLanguages\“\r\n\r\n”;
   str+=“on\r\n”;
//— If the picture has been uploaded on the server, pass its link
   if(ArraySize(file)!=0)
     {
      str+=“–“+sep+“\r\n”;
      str+=“Content-Disposition: form-data; name=\”attachedImage_0\“\r\n\r\n”;
      str+=filename+“\r\n”;
     }
//— The final string of the multipart request
   str+=“–“+sep+“–\r\n”;
//— Out the body of the POST request together in one string
   StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8);
   ArrayResize(data,ArraySize(data)-1);
//— Prepare the request header  
   str=auth+“Content-Type: multipart/form-data; boundary=”+sep+“\r\n”;
//— Request to post a message on the user wall at mql5.com
   res=WebRequest(“POST”,“https://www.mql5.com/enusers/”+login+“/wall”,str,0,data,data,str);
//— Return true for successful execution
   return(res==200);
  }
//+——————————————————————+
//| Script program start function                                    |
//+——————————————————————+
void OnStart()
  {
//— Post a message on mql5.com, including an image, the path to which is taken from the InpFileName parameter
   PostToNewsFeed(InpLogin,InpPassword,“Checking the expanded version of WebRequest\r\n”
                  “(This message has been posted by the WebRequest.mq5 script)”,InpFileName,InpFileType);
  }
//+——————————————————————+

 WebRequest()関数の2番目のバージョンを使用する例

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">