mql4 ile basit POST/GET HttpRequest

 

Herkese merhaba,

Bu konunun defalarca tartışıldığını biliyorum. Ancak bu konuyla ilgili bulduğum tüm makaleler ne yazık ki çok karmaşıktı veya çok eski oldukları için hata mesajı veriyorlardı. Bu nedenle, basit bir POST/GET isteği yapan bir komut dosyası oluşturamadım.

Bu yüzden, sadece bir sunucuya POST ve GET isteği göndermek istiyorum. Hedef dosya basit bir php dosyasıdır.

Bu, https://www.mql5.com/en/code'a dayanan ürettiğim ilk test komut dosyam:

 #import   "Wininet.dll"
   int InternetOpenA( string , int , string , string , int );
   int InternetConnectA( int , string , int , string , string , int , int , int ); 
   int InternetOpenUrlA( int , string , string , int , int , int );
   int InternetReadFile( int , string , int , int & OneInt[]);
   int InternetCloseHandle( int ); 
   int HttpOpenRequestA( int , string , string , string , string , string & AcceptTypes[], int , int );
   bool HttpSendRequestA( int , string , int , string , int );
#import
 

int OnInit()
{
   string headers = "Content-Type: application/x-www-form-urlencoded" ;
   string data = "" ;
   string acceptTypes[ 1 ] = { "*/*" };

   int HttpOpen = InternetOpenA( "HTTP_Client_Sample" , 1 , NULL , NULL , 0 ); 
   int HttpConnect = InternetConnectA(HttpOpen, "http://localhost/tradex" , 7777 , NULL , NULL , 3 , 0 , 1 );
   int HttpRequest = HttpOpenRequestA(HttpConnect, "POST" , "/index.php" , "HTTP/1.1" , NULL , acceptTypes, 0 , 1 );
   string result = HttpSendRequestA(HttpRequest, headers, StringLen (headers), data, StringLen (data));

   int read[ 1 ];
   Print ( "This is the POST result: " + result);

   return (0);
}

Maalesef sonuç olarak "0" alıyorum, bu da isteğin başarılı olmadığı anlamına geliyor. Ama nedenini bulamıyorum.

Umarım bana yardım edebilirsin.

Teşekkürler,

Alex

 

tanımladığınız sorunun doğası gereği, B600 kullandığınızı tahmin ediyorum >

bu nedenle , örneğin UNICODE kullanarak kodunuzu uyarlamanız gerekir.

 int InternetOpen W (...

ve değil (ANSI)

 int InternetOpen A (...
 
coolex :

Herkese merhaba,

Bu konunun defalarca tartışıldığını biliyorum. Ancak bu konuyla ilgili bulduğum tüm makaleler ne yazık ki çok karmaşıktı veya çok eski oldukları için hata mesajı veriyorlardı. Bu nedenle, basit bir POST/GET isteği yapan bir komut dosyası oluşturamadım.

Bu yüzden, sadece bir sunucuya POST ve GET isteği göndermek istiyorum. Hedef dosya basit bir php dosyasıdır.

Bu, https://www.mql5.com/en/code'a dayanan ürettiğim ilk test komut dosyam:

Maalesef sonuç olarak "0" alıyorum, bu da isteğin başarılı olmadığı anlamına geliyor. Ama nedenini bulamıyorum.

Umarım bana yardım edebilirsin.

Teşekkürler,

Alex


https://www.mql5.com/en/forum/149321
 

TAMAM. Hızlı cevap için teşekkürler. Henüz test etmedim ama lütfen biraz daha ayrıntı verebilir misiniz? Sorduğum için üzgünüm ama B600 nedir? Ayrıca, http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx adresinde "InternetOpenW" veya "InternetOpenA" işlevleri için belgeler bulamıyorum.

"...A" ve "...W" nereden geliyor?

Yardım için teşekkürler.

 
coolex :

ama B600 nedir?

sürüm 600 ve üzeri (MetaTrader) = 600 ve üzeri sürüm = B600 >

coolex :

"...A" ve "...W" nereden geliyor?

umarım okuyabilirsin

Sağladığınız bağlantıdaki aynı sayfada ( altta ):

Unicode ve ANSI adları InternetOpenUrlW (Unicode) ve InternetOpenUrlA (ANSI)

 
Tamam, http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx sitesinde "InternetOpenW" veya "InternetOpenA" işlevlerini bulamadım çünkü orada yoklar ama "InternetOpenUrlW" ve "InternetOpenUrlA" elbette var.
Bu yüzden "...W" ve "...A" soruyordum ve sorun okumak değil :-).

Temel işlev "HttpOpenRequest"tir, çünkü onun yardımıyla bir URL'ye POST ve GET isteği gönderebilirim. İşte belge: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384233(v=vs.85).aspx
Ancak "HttpOpenRequestA" mı yoksa "HttpOpenRequestW" mi kullanmam gerektiğini bilmiyorum çünkü "HttpOpenRequestW" kullandığımda şu hata mesajını alıyorum: "Erişim ihlali 'Wininet.dll'de 0x0000007B'ye okundu". "HttpOpenRequestA" kullanarak hala başlangıçtaki sorunu yaşıyorum.

Yani aslında POST/GET isteği için "InternetOpenUrlW" işlevine hiç ihtiyacım olmadığını düşünüyorum.

Bu hala çalışmayan mevcut koddur :-( :

 #import   "Wininet.dll"
   int   InternetOpenW( string , int , string , string , int );
   int   InternetConnectW( int , string , int , string , string , int , int , int ); 
   int   InternetOpenUrlW( int , string , string , int , int , int );
   int   InternetCloseHandle( int ); 
   int   HttpOpenRequestA ( int , string , string , string , string , string & AcceptTypes[], int , int );
   bool HttpSendRequestW( int , string , int , string , int );
#import
 

int OnInit ()
{
   string headers = "Content-Type: application/x-www-form-urlencoded" ;
   string data = "" ;
   string acceptTypes[ 1 ] = { "*/*" };

   int HttpOpen = InternetOpenW( "HTTP_Client_Sample" , 1 , NULL , NULL , 0 );  
   int HttpConnect = InternetConnectW(HttpOpen, "http://localhost/tradex" , 7777 , NULL , NULL , 3 , 0 , 1 );
   int HttpRequest = HttpOpenRequestA(HttpConnect, "POST" , "/index.php" , "HTTP/1.1" , NULL , acceptTypes, 0 , 1 );
   string result = HttpSendRequestW(HttpRequest, headers, StringLen (headers), data, StringLen (data));

   int read[ 1 ];
   Print ( "This is the POST result: " + result);

   return ( 0 );
}
 

yukarıda UNICODE için kodunuzu uyarlamanız gerektiğini yazdım ve size sadece bir örnek verdim ve yine de uyarlamanız gereken şeyleri bıraktınız .

 int   HttpOpenRequest A ( int , string , string , string , string , string & AcceptTypes[], int , int );

ve şimdiden söylüyorum, hepsi bu değil , dahası var

 

merhaba qjol,

Bir önceki yazımda, "HttpOpenRequest A " öğesini "HttpOpenRequest W " olarak değiştirmenin " Wininet.dll'de 0x0000007B'ye erişim ihlali okundu" hatasına neden olduğunu yazmıştım.

UNICODE olarak değiştirdiğim diğer tüm işlevler .

Yanlış anladıysam özür dilerim ama basit bir POST/GET isteği için başka ne eksik veya yanlış?

 
buraya bir göz at
 

merhaba qjol,

çok yararlı olan bağlantı için teşekkürler. Bir URL'den veri almanın işe yaradığını görebiliyorum ama yine de veriyi nasıl POST yapacağımı bilmiyorum. Komut dosyanız " HttpOpenRequestW" işlevini tanımlar ancak kullanmaz. Ayrıca, komut dosyası yalnızca harika çalışan verileri alır.

Ama yine de verileri nasıl POST yapabilirim? " HttpOpenRequestW " ile çalışması gerekir, ancak hata mesajını almadan önce zaten yayınladığım gibi: " 'Wininet.dll'de 0x0000007B'ye erişim ihlali okundu" ve " HttpOpenRequestA" açıkça çalışmıyor.

Umarım yardımcı olabilirsiniz.


 

kodunuzu kontrol etmeye karar verdim ve düzelttim ama sonuç = yanlış olduğundan, kontrol ettim ve 12005 hata kodunu alıyorum ve microsoft'un hata kodu listesine göre bu şu anlama geliyor

ERROR_INTERNET_INVALID_URL

12005

URL geçersiz.


   #import   "Wininet.dll"
   int InternetOpenW( string , int , string , string , int );
   int InternetConnectW( int , string , int , string , string , int , int , int ); 
   int InternetOpenUrlW( int , string , string , int , int , int );
   int InternetReadFile( int , string , int , int & OneInt[]);
   int InternetCloseHandle( int ); 
   int HttpOpenRequestW( int , string , string , string , string , string & AcceptTypes[], int , int );
   bool HttpSendRequestW( int , string , int , string , int );
#import
#import "kernel32.dll"
int GetLastError( void );
#import

   string headers = "Content-Type: application/x-www-form-urlencoded" ;
   string data = "" ;
   string acceptTypes[ 1 ] = { "*/*" };

   int HttpOpen = InternetOpenW( "HTTP_Client_Sample" , 1 , "" , "" , 0 );  
   int HttpConnect = InternetConnectW(HttpOpen, "http://localhost/tradex" , 7777 , "" , "" , 3 , 0 , 1 );
   int HttpRequest = HttpOpenRequestW(HttpConnect, "POST" , "/index.php" , "HTTP/1.1" , "" , acceptTypes, 0 , 1 );
   bool result = HttpSendRequestW(HttpRequest, headers, StringLen (headers), data, StringLen (data));
   Alert ( "Last MSDN Error =: " , kernel32::GetLastError());
   
   int read[ 1 ]; // not used
   Print ( "This is the POST result: " , result);
   if (HttpOpen > 0 )
   InternetCloseHandle(HttpOpen);
   if (HttpRequest > 0 )
   InternetCloseHandle(HttpRequest);
   
   return ;