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 InternetOpenW(...

(ANSI)ではなく

int InternetOpenA(...
 
coolex:

皆さん、こんにちは。

この話題は何度も議論されているのは知っています。しかし、私が見つけたこのトピックの記事はすべて、残念ながら複雑すぎたり、古すぎるためにエラーメッセージが表示されたりしました。したがって、私は単純なPOST/GETリクエストを行うスクリプトを作成することができませんでした。

そこで、単純にPOSTとGETのリクエストをサーバーに送りたいのです。ターゲットファイルは単純なphpファイルです。

これは、私が最初に作成したテストスクリプトで、https://www.mql5.com/en/code をベースにしています。

残念ながら、私は結果として "0 "を受け取り、それは要求が成功しなかったことを意味します。しかし、私は原因を見つけることができません。

あなたが私を助けることができることを願っています。

ありがとうございます。

アレックス


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

OKです。迅速な返信をありがとうございます。まだテストしていないのですが、もう少し詳しく教えていただけませんか?質問で申し訳ないのですが、B600とは何でしょうか?さらに、「InternetOpenW」「InternetOpenA」関数のドキュメントがhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx に見当たりません。

この「...A」と「...W」はどこから来ているのでしょうか?

助けてくれてありがとうございます。

 
coolex:

とありますが、B600とは何でしょうか?

バージョン600以上(MetaTrader)=ビルド600以上=B600>となります。

coolex

の「...A」「...W」はどこから来ているのでしょうか?

をお読みいただければと思います。

という記述があります(一番)。

ユニコードとANSIの名前 InternetOpenUrlW(ユニコード)とInternetOpenUrlA(ANSI)。

 
OK、私はサイト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
しかし、「HttpOpenRequestA」と「HttpOpenRequestW」のどちらを使うべきかわかりません。なぜなら、「HttpOpenRequestW」を使うと、「Access violation read to 0x0000007B in 'Wininet.dll' 」というエラーメッセージが表示されるのです。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);
}
 

UNICODEに対応させる必要があると書きましたが、1つだけ例を挙げましたが、まだ対応 せる必要があるものが残っています。

 int  HttpOpenRequestA (int, string, string, string, string, string& AcceptTypes[], int, int);

を残しているのです。

 

qjolさん、こんにちは。

前回の投稿で、「HttpOpenRequestA」を「HttpOpenRequestW」に変更すると、「Access violation read to 0x0000007B in 'Wininet.dll'」というエラーが発生すると書きました。

他の関数は すべてUNICODEに変更済みです。

もし私が誤解していたら申し訳ありませんが、単純なPOST/GETリクエストのために、他に何が欠けているか、間違っているのでしょうか?

 
見て みる
 

qjolさん、こんにちは。

とても参考になるリンクをありがとうございます。URLからデータをGET するのは分かるのですが、データをPOST する方法がまだ分かりません。このスクリプトは、関数 "HttpOpenRequestW" を定義していますが、それを使って いません。さらに、スクリプトはデータを受け取るだけで、うまく動作しています。

しかし、データをPOST するにはどうしたらよいのでしょうか?HttpOpenRequestW" で動作するはずですが、以前投稿したように、エラーメッセージが表示されます:"'Wininet.dll' の 0x0000007B へのアクセス違反読み取り "と"HttpOpenRequestA "は明らかに動作して いません。

あなたが助けることができることを願っています。


 

私はあなたのコードをチェックすることに決め、それを修正しましたが、result = falseなので、私はそれをチェックアウトし、私はエラーコード 12005を取得し、マイクロソフトのエラーコードリストによると、それは次のことを意味します。

エラー_インターネット_無効な_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;
理由: