mql4를 사용한 간단한 POST/GET HttpRequest

 

여러분, 안녕하세요,

이 주제가 여러 번 논의되었다는 것을 알고 있습니다. 그러나 주제에 대해 찾은 모든 기사는 불행히도 너무 복잡하거나 너무 오래되어 오류 메시지를 생성합니다. 따라서 간단한 POST/GET 요청을 수행하는 스크립트를 만들 수 없었습니다.

따라서 POST 및 GET 요청을 서버에 보내고 싶습니다. 대상 파일은 간단한 php 파일입니다.

이것은 https://www.mql5.com/en/code 를 기반으로 생성한 첫 번째 테스트 스크립트입니다.

 #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);
}

불행히도 요청이 성공하지 못했음을 의미하는 결과 "0"을 받습니다. 하지만 이유를 알 수 없습니다.

당신이 나를 도울 수 있기를 바랍니다.

감사해요,

알렉스

 

당신이 설명하는 문제의 성격에서 나는 당신이 B600을 사용하고 있다고 추측합니다 >

예를 들어 UNICODE를 사용하여 코드 수정 해야 합니다.

 int InternetOpen W (...

(ANSI)

 int InternetOpen A (...
 
coolex :

여러분, 안녕하세요,

이 주제가 여러 번 논의되었다는 것을 알고 있습니다. 그러나 주제에 대해 찾은 모든 기사는 불행히도 너무 복잡하거나 너무 오래되어 오류 메시지를 생성합니다. 따라서 간단한 POST/GET 요청을 수행하는 스크립트를 만들 수 없었습니다.

따라서 POST 및 GET 요청을 서버에 보내고 싶습니다. 대상 파일은 간단한 php 파일입니다.

이것은 https://www.mql5.com/en/code 를 기반으로 생성한 첫 번째 테스트 스크립트입니다.

불행히도 요청이 성공하지 못했음을 의미하는 결과 "0"을 받습니다. 하지만 이유를 알 수 없습니다.

당신이 나를 도울 수 있기를 바랍니다.

감사해요,

알렉스


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

확인. 빠른 답변 감사합니다. 아직 테스트는 해보지 않았지만 좀 더 자세히 알려주실 수 있으신가요? 질문드려 죄송합니다만 B600이 무엇인가요? 또한 http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx 에서 "InternetOpenW" 또는 "InternetOpenA" 기능에 대한 설명서를 찾을 수 없습니다.

"...A"와 "...W"는 어디에서 왔습니까?

도와 줘서 고맙다.

 
coolex :

하지만 B600은 무엇입니까?

버전 600 이상(MetaTrader) = 빌드 600 이상 = B600 >

쿨렉스 :

"...A"와 "...W"는 어디에서 왔습니까?

나는 당신이 읽을 수 있기를 바랍니다

귀하가 제공한 링크의 동일한 페이지에서 ( 하단에 ) 다음과 같이 말합니다.

유니코드 및 ANSI 이름 InternetOpenUrlW (유니코드) 및 InternetOpenUrlA (ANSI)

 
알겠습니다. http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx 사이트에서 "InternetOpenW" 또는 "InternetOpenA" 기능을 찾을 수 없습니다. 그들은 거기에 존재하지 않지만 "InternetOpenUrlW"와 "InternetOpenUrlA"는 물론 존재합니다.
그래서 "...W"와 "...A"를 요구했고 읽는 것이 문제가 아닙니다 :-).

핵심 기능은 "HttpOpenRequest"입니다. 도움을 받아 URL에 POST 및 GET 요청을 보낼 수 있기 때문입니다. 문서는 다음과 같습니다. http://msdn.microsoft.com/en-us/library/windows/desktop/aa384233(v=vs.85).aspx
그러나 "HttpOpenRequestW"를 사용할 때 "액세스 위반이 'Wininet.dll'에서 0x0000007B로 읽혔습니다"라는 오류 메시지를 받기 때문에 "HttpOpenRequestA" 또는 "HttpOpenRequestW"를 사용해야 하는지 모르겠습니다. "HttpOpenRequestA"를 사용하면 여전히 처음과 같은 문제가 있습니다.

따라서 실제로 POST/GET 요청의 경우 "InternetOpenUrlW" 기능이 전혀 필요하지 않다고 생각합니다.

이것은 여전히 작동하지 않는 현재 코드입니다 :-( :

 #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 );
}
 

위에서 유니코드에 맞게 코드를 조정해야 한다고 썼고 한 가지 예만 제시했지만 여전히 적응해야 할 사항을 남겨두었 습니다.

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

그리고 그것이 전부 가 아니라 더 많다는 것을 미리 말씀드립니다.

 

안녕하세요 qjool님

이전 게시물에서 "HttpOpenRequest A "를 "HttpOpenRequest W "로 변경하면 "액세스 위반이 'Wininet.dll'에서 0x0000007B 읽기" 오류가 발생한다고 썼습니다.

다른 모든 기능 은 이미 UNICODE로 변경했습니다.

제가 잘못 이해했다면 죄송하지만 간단한 POST/GET 요청에 대해 누락되었거나 잘못된 것은 무엇입니까?

 
여기 좀 봐
 

안녕하세요 qjool님

매우 도움이 되는 링크를 주셔서 감사합니다. URL에서 GET 데이터가 작동하는 것처럼 보이지만 여전히 데이터를 POST 하는 방법을 모르겠습니다. 스크립트는 " HttpOpenRequestW" 기능을 정의하지만 사용하지 않습니다. 또한 스크립트는 잘 작동하는 데이터만 검색합니다.

그러나 여전히 어떻게 데이터를 POST 할 수 있습니까? " HttpOpenRequestW "와 함께 작동해야 하지만 오류 메시지가 표시되기 전에 이미 게시한 것처럼 " 'Wininet.dll'의 0x0000007B에 대한 액세스 위반 읽기" 및 " HttpOpenRequestA"가 분명히 작동하지 않습니다.

당신이 도울 수 있기를 바랍니다.


 

귀하의 코드를 확인하기로 결정하고 수정했지만 결과 = false이므로 확인했는데 오류 코드 12005가 표시되고 Microsoft의 오류 코드 목록에 따르면 의미합니다.

ERROR_INTERNET_INVALID_URL

12005

URL이 잘못되었습니다.


   #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 ;
사유: