Download MetaTrader 5

Scripts: HTTP using WinINet directly in mql4

To add comments, please log in or register
Let your idle PCs do something useful. Join MQL5 Cloud Network!
MetaQuotes Software Corp.
Moderator
181052
MetaQuotes Software Corp. 2012.03.09 06:59 

HTTP using WinINet directly in mql4:

This is a "conceptual" script that uses the WinINet functions to load a HTTP page directly from mql4, without a C++ dll

Author: Marco

erzo
109
erzo 2012.03.09 07:24  
Hi mapick!
Thans for the code. I want to ask you, can WinInet send POST data, like Ajax Http POST method? (Not file but some Json data.) If you write test code for this, please share with us. Thank you!
Marco
8
Marco 2012.03.09 08:27  

hi and thanks to you for your interest!

yes, you can send any type of request, you can try in the script, using the verb POST instead of the GET, and changing the http://... url, adding your parameters, i.e.: "http://mysite.com?par1=val1&par2=val2"

if you post here the example of what you need, I can adapt the script

erzo
109
erzo 2012.03.09 10:45  

Mapick, thanks for your help! But I think, do not change this nice simple code, if you write new, add it in another file.

Here are the details. I have java code that waits for be called by Amibroker via Ajax Json requests, and i want to reuse it with mt4. But the data must be sent by POST (in the header part of the http request), and i cannot write "http://mysite.com?par1=val1&par2=val2", because it would be too long, and also the java code would have to rewrite. Here is the javascript from Amibroker that calls java (ObjectToSend is a javascript object, that has ohlc data, class name, function name, etc., and it is sent after converting to a looong Json string. Target is simply "javaremote.json"). So i want to POST from mq4 to java a Json string (and waiting for the response), without c++ and dll coding.


<%
    function getObjectReceivedByAjax(ObjectToSend, Target) {
        request = new ActiveXObject("Msxml2.XMLHTTP");
        request.open("POST", "http://127.0.0.1:7777/" + Target, false);
        request.send(JSON.stringify(ObjectToSend));
        ObjectReceived = JSON.parse(request.responseText);
        return ObjectReceived;
    }
%>
Marco
8
Marco 2012.03.09 12:45  

yes! there is the function to add the header you want, I adjust the code and I post it here, they are only a couple of lines to add to the script

Point Zero
792
Point Zero 2012.03.09 14:22  
Very interesting, Can petitions be sent by post? What happens if the client does not have ....?
Wininet.dll
Marco
8
Marco 2012.03.09 16:21  
flaab:
Very interesting, Can petitions be sent by post? What happens if the client does not have ....?
Wininet.dll


hi and thanks! the WinINet.dll should be already included from XP onward, however if you look for "download wininet.dll" you or the EA user can easily find it, for example from http://www.dll-files.com/dllindex/dll-files.shtml?wininet

Marco
8
Marco 2012.03.10 09:42  
erzo:

Mapick, thanks for your help! But I think, do not change this nice simple code, if you write new, add it in another file.

Here are the details. I have java code that waits for be called by Amibroker via Ajax Json requests, and i want to reuse it with mt4. But the data must be sent by POST (in the header part of the http request), and i cannot write "http://mysite.com?par1=val1&par2=val2", because it would be too long, and also the java code would have to rewrite. Here is the javascript from Amibroker that calls java (ObjectToSend is a javascript object, that has ohlc data, class name, function name, etc., and it is sent after converting to a looong Json string. Target is simply "javaremote.json"). So i want to POST from mq4 to java a Json string (and waiting for the response), without c++ and dll coding.


<%
    function getObjectReceivedByAjax(ObjectToSend, Target) {
        request = new ActiveXObject("Msxml2.XMLHTTP");
        request.open("POST", "http://127.0.0.1:7777/" + Target, false);
        request.send(JSON.stringify(ObjectToSend));
        ObjectReceived = JSON.parse(request.responseText);
        return ObjectReceived;
    }
%>


to send your HEADER you should modify the code in this way:

1) send your USERNAME and PASSWORD if any to login page, or to home page

   int HttpConnect = InternetConnectA(HttpOpen, "http://javaremote.json/YOUR_LOGIN_PAGE", 80, "USERNAME", "PASSWORD", 3, 0, 1); 

otherwise you can let the empty strings as in the actual code

2) send your header, in case change the URL if the page is different from login or home page

   string header = StringConcatenate("<%",
                                       "function getObjectReceivedByAjax(ObjectToSend, Target) {",
                                       "request = new ActiveXObject(\"Msxml2.XMLHTTP\");",
                                       "request.open(\"POST\", \"http://127.0.0.1:7777/\" + Target, false);",
                                       "request.send(JSON.stringify(ObjectToSend));",
                                       "ObjectReceived = JSON.parse(request.responseText);",
                                       "return ObjectReceived;",
                                       "}",
                                      "%>");
   int HttpRequest = InternetOpenUrlA(HttpOpen, "http://javaremote.json", header, StringLen(header), 0, 0);

3) ...tell me if it works... otherwise I'll check and adjust the code!

erzo
109
erzo 2012.03.10 17:04  
Mapick, i tred your solution, but it did not work. I searched a little, and found this: http://support.microsoft.com/kb/165298

It solved everything i needed. Here is my code modification that works fine:

#import  "Wininet.dll"
   ...
   int HttpOpenRequestA(int, string, string, string, string, string& AcceptTypes[], int, int);
   bool HttpSendRequestA(int, string, int, string, int);
   ...
#import
int init()
{
   //----
   string headers = "Content-Type: application/x-www-form-urlencoded";
   string data = "{\"ohlcVectors\":{\"ticker\":\"dax\",\"barIntervalSeconds\":300,\"open\":[6844.2998046875," +
      "6847.7998046875]},\"className\":\"MAIndicator\",\"parameters\":{\"periods\":2}}";
   string acceptTypes[1] = {"*/*"};
   int HttpOpen = InternetOpenA("HTTP_Client_Sample", 1, NULL, NULL, 0); 
   int HttpConnect = InternetConnectA(HttpOpen, "127.0.0.1", 7777, NULL, NULL, 3, 0, 1);
   int HttpRequest = HttpOpenRequestA(HttpConnect, "POST", "/javaremote.json", NULL, NULL, acceptTypes, 0, 1);
   HttpSendRequestA(HttpRequest, headers, StringLen(headers), data, StringLen(data));
   
   int read[1];
   ...
Marco
8
Marco 2012.03.11 07:14  
erzo:
Mapick, i tred your solution, but it did not work. I searched a little, and found this: http://support.microsoft.com/kb/165298

It solved everything i needed. Here is my code modification that works fine

......

Thanks Erzo! Your is a very useful contribution!

Point Zero
792
Point Zero 2012.03.12 17:50  

Nice contribution Mapick, could you give an example of how to send parameters using POST and retrieve the result?

Cheers and thanks.

To add comments, please log in or register