WebRequest
Отправляет HTTP-запрос на указанный сервер. Существует два варианта функции:
1. Для отправки простых запросов вида "ключ=значение" с использованием заголовка Content-Type: application/x-www-form-urlencoded.
int WebRequest(
const string method,
const string url,
const string cookie,
const string referer,
int timeout,
const char &data[],
int data_size,
char &result[],
string &result_headers
); |
2. Для отправки запросов произвольного типа с указанием собственного набора заголовков для более гибкого взаимодействия с различными Web-сервисами.
int WebRequest(
const string method,
const string url,
const string headers,
int timeout,
const char &data[],
char &result[],
string &result_headers
); |
Параметры
method
[in] Метод HTTP.
url
[in] URL-адрес.
headers
[in] Заголовки запроса вида "ключ: значение", разделенные переносом строки "\r\n".
cookie
[in] Значение Cookie.
referer
[in] Значение заголовка Referer HTTP-запроса.
timeout
[in] Таймаут в миллисекундах.
data[]
[in] Массив данных тела HTTP-сообщения.
data_size
[in] Размер массива data[].
result[]
[out] Массив с данными ответа сервера.
result_headers
[out] Заголовки ответа сервера.
Возвращаемое значение
Примечание
Пример использования 1-го варианта функции :
void OnStart()
{
string cookie=NULL,headers;
char post[],result[];
int res;
//--- для работы с сервером необходимо добавить URL "https://www.google.com/finance"
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
string google_url="https://www.google.com/finance";
//--- обнуляем код последней ошибки
ResetLastError();
//--- загрузка html-страницы с Google Finance
int timeout=5000; //--- timeout менее 1000 (1 сек.) недостаточен при низкой скорости Интернета
res=WebRequest("GET",google_url,cookie,NULL,timeout,post,0,result,headers);
//--- проверка ошибок
if(res==-1)
{
Print("Ошибка в WebRequest. Код ошибки =",GetLastError());
//--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
MessageBox("Необходимо добавить адрес '"+google_url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
}
else
{
//--- успешная загрузка
PrintFormat("Файл успешно загружен, Размер файла =%d байт.",ArraySize(result));
//--- сохраняем данные в файл
int filehandle=FileOpen("GoogleFinance.htm",FILE_WRITE|FILE_BIN);
//--- проверка ошибки
if(filehandle!=INVALID_HANDLE)
{
//--- сохраняем содержимое массива result[] в файл
FileWriteArray(filehandle,result,0,ArraySize(result));
//--- закрываем файл
FileClose(filehandle);
}
else Print("Ошибка в FileOpen. Код ошибки =",GetLastError());
}
} |
Пример использования 2-го варианта функции :
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property script_show_inputs
#property description "Пример скрипта, который публикует сообщение "
#property description "пользователя в ленте на mql5.com"
input string InpLogin =""; //Ваш аккаунт в MQL5.com
input string InpPassword=""; //Пароль для вашего аккаунта
input string InpFileName="EURUSDM5.png"; //Картинка в папке MQL5/Files/
input string InpFileType="image/png"; //Правильный mime type картинки
//+------------------------------------------------------------------+
//| Публикация сообщения с картинкой в ленте mql5.com |
//+------------------------------------------------------------------+
bool PostToNewsFeed(string login,string password,string text,string filename,string filetype)
{
int res; // для помещения результата выполнения операций
char data[]; // массив с данными для отправки POST-запросов
char file[]; // сюда прочитаем картинку
string str="Login="+login+"&Password="+password;
string auth,sep="-------Jyecslin9mp8RdKV"; // разделитель данных формата multipart
//--- имеется файл - пробуем прочитать его
if(filename!=NULL && filename!="")
{
res=FileOpen(filename,FILE_READ|FILE_BIN);
if(res<0)
{
Print("Ошибка открытия файла \""+filename+"\"");
return(false);
}
//--- читаем данные файла
if(FileReadArray(res,file)!=FileSize(res))
{
FileClose(res);
Print("Ошибка чтения файла \""+filename+"\"");
return(false);
}
//---
FileClose(res);
}
//--- сформируем тело POST запроса на авторизацию
ArrayResize(data,StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8)-1);
//--- сбросим код ошибки
ResetLastError();
//--- выполняем запрос на авторизацию
res=WebRequest("POST","https://www.mql5.com/ru/auth_login",NULL,0,data,data,str);
//--- если авторизация не удалась
if(res!=200)
{
Print("Ошибка авторизации #"+(string)res+", LastError="+(string)GetLastError());
return(false);
}
//--- вычитаем из заголовка ответа сервера cookie авторизации
res=StringFind(str,"Set-Cookie: auth=");
//--- если cookie не найден, сообщим об ошибке
if(res<0)
{
Print("Ошибка, данные авторизации не найдены в ответе сервера (проверте логин/пароль)");
return(false);
}
//--- запомним авторизационные данные и сформируем заголовок для последующих запросов
auth=StringSubstr(str,res+12);
auth="Cookie: "+StringSubstr(auth,0,StringFind(auth,";")+1)+"\r\n";
//--- если имеется файл данных, отправляем его на сервер
if(ArraySize(file)!=0)
{
//--- сформируем тело запроса
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);
//--- сформируем заголовок запроса
str=auth+"Content-Type: multipart/form-data; boundary="+sep+"\r\n";
//--- сбросим код ошибки
ResetLastError();
//--- выполняем запрос на передачу файла изображения на сервер
res=WebRequest("POST","https://www.mql5.com/upload_file",str,0,data,data,str);
//--- проверим результат запроса
if(res!=200)
{
Print("Ошибка передачи файла на сервер #"+(string)res+", LastError="+(string)GetLastError());
return(false);
}
//--- получим ссылку на картинку, которую загрузили на сервер
str=CharArrayToString(data);
if(StringFind(str,"{\"Url\":\"")==0)
{
res =StringFind(str,"\"",8);
filename=StringSubstr(str,8,res-8);
//--- при ошибке закачки файла, вернётся пустая ссылка
if(filename=="")
{
Print("Передача файла на сервер не удалась");
return(false);
}
}
}
//--- сформируем тело запроса публикации сообщения на сервере
str ="--"+sep+"\r\n";
str+="Content-Disposition: form-data; name=\"content\"\r\n\r\n";
str+=text+"\r\n";
//--- на каких языках сайта mql5.com будет доступна публикация
str+="--"+sep+"\r\n";
str+="Content-Disposition: form-data; name=\"AllLanguages\"\r\n\r\n";
str+="on\r\n";
//--- если картинка была загружена на сервер - передадим ссылку на неё
if(ArraySize(file)!=0)
{
str+="--"+sep+"\r\n";
str+="Content-Disposition: form-data; name=\"attachedImage_0\"\r\n\r\n";
str+=filename+"\r\n";
}
//--- завершающая строка multipart-запроса
str+="--"+sep+"--\r\n";
//--- собираем тело POST-запроса в одну строку
StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8);
ArrayResize(data,ArraySize(data)-1);
//--- подготовим заголовок запроса
str=auth+"Content-Type: multipart/form-data; boundary="+sep+"\r\n";
//--- выполняем запрос на публикацию сообщение в ленте пользователя mql5.com
res=WebRequest("POST","https://www.mql5.com/ru/users/"+login+"/wall",str,0,data,data,str);
//--- в случае успешной публикации вернем true
return(res==200);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- опубликуем пост на mql5.com c картинкой, путь к которой возьмем из параметра InpFileName
PostToNewsFeed(InpLogin,InpPassword,"Проверка расширенной версии функции WebRequest\r\n"
"(Данное сообщение размещено скриптом WebRequest.mq5)",InpFileName,InpFileType);
}
//+------------------------------------------------------------------+ |
|