WebRequest(): заголовок "Accept: application/json" не работает?

 

Всем привет!

Столкнулся с ошибкой при работе с WebRequest(). Сначала продемонстрирую результаты из командной строки.

Делаем запрос без указания заголовков и получаем такой результат. В данном случае всё правильно, так и должно быть. Ответ возвращается в формате text/html.

C:\Users\tol64>curl -I localhost:8000/api/user
HTTP/1.1 500 Internal Server Error
Host: localhost:8000
Date: Thu, 20 Jan 2022 12:16:21 GMT
Connection: close
X-Powered-By: PHP/7.4.6
Cache-Control: no-cache, private
date: Thu, 20 Jan 2022 12:16:21 GMT
Content-Type: text/html; charset=UTF-8
Vary: Origin

Если изменить запрашиваемый тип данных на application/json, то получаем вот такой результат:

C:\Users\tol64>curl -H "Accept: application/json" -I localhost:8000/api/user
HTTP/1.1 401 Unauthorized
Host: localhost:8000
Date: Thu, 20 Jan 2022 12:17:02 GMT
Connection: close
X-Powered-By: PHP/7.4.6
Cache-Control: no-cache, private
Date: Thu, 20 Jan 2022 12:17:02 GMT
Content-Type: application/json
Vary: Origin
C:\Users\tol64>curl -H "Accept: application/json" localhost:8000/api/user
{"message":"Unauthenticated."}

//---

При отправке запроса из MetaTrader 5 с заголовком Accept: application/json всегда получаем ответ:

Content-Type: text/html; charset=UTF-8


//---

Как получить ожидаемый результат?

P.S. В командной строке, в Postman и в браузерном приложении всё работает, как нужно. 

 

https://www.mql5.com/ru/forum/304239/page51#comment_11349486

Я так и не получил ответа.

 
Alain Verleyen #:

https://www.mql5.com/ru/forum/304239/page51#comment_11349486

Я так и не получил ответа.

Спасибо за информацию. 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 2007: Экономический календарь, MQL5-программы в виде сервисов

Alain Verleyen, 2019.04.16 03:50

Build 2007/2025.

Кажется, невозможно изменить заголовок «Accept» в WebRequest (с mql4 это работает).

Прикрепленный код должен возвращать JSON-ответ, например:

{ "responseParameters": { "doui_setResponseParameters": [ "8AA8D0CD6A05153A016A16735AF94E0E"]}}

Но ответ - HTML-файл, потому что серверу нужен заголовок «Accept: application / json». Я знаю это, потому что это работает с Почтальоном, например.

При проверке HTTP, отправляемого MT5 с Wireshark, заголовок «Принять» всегда:

Принять: * / *

Это ошибка или я что-то упустил?


 

Пример кода:

   string url = "http://localhost:8000/api/user";
   string request_headers = "Accept: application/json";
   uchar  request_data[];
   uchar  response_body[];
   string response_headers;
   int    response_code = -1;

   ResetLastError();
   response_code = WebRequest("GET", url, 
         request_headers, NULL, request_data, 
         response_body, response_headers);
   
   int error = GetLastError();
   Print("\nresponse_code: ", response_code, ", error: ", error);

//---

В программе Wireshark видно, что заголовок Accept: application/json заменён на Accept: */*


 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Обсуждение статьи "Веб-проекты (Часть III): Система авторизации Laravel/MetaTrader 5"

Anatoli Kazharski, 2022.05.19 13:47

Починили. 

На билде 3295 проблемы нет.

[response_headers]
Host: localhost
Date: Thu, 19 May 2022 11:39:26 GMT
Connection: close
X-Powered-By: PHP/7.4.6
Cache-Control: no-cache, private
Date: Thu, 19 May 2022 11:39:26 GMT
Content-Type: application/json
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59