POST JSON через HttpSendRequest в С++

  1. Отправляю запрос POST, с JSON в заголовке.
  2. Подключение к серверу проходит.
  3. Сервер мне возвращает массив JSON, который должен вернуть в ответ на подключение.
  4. Но переданных мной данных JSON не видит, т.к. ответ JSON и ошибку не возвращает.

~

HINTERNET hOpenHandle, hResourceHandle, hConnectHandle;

hOpenHandle = InternetOpenA("Terminal", INTERNET_OPEN_TYPE_DIRECT, NULL, 
NULL);
if (hOpenHandle)
  {
  hConnectHandle = InternetConnectA(hOpenHandle, "api-demo.exante.eu", 
  INTERNET_DEFAULT_HTTP_PORT, "a0bf5e14-d039-451b-a2ea-fc5cf778f7da", 
  "kdyM5ITrvaMDie5YVrTi", INTERNET_SERVICE_HTTP, 0, 0);
    if (hConnectHandle)
      {
      PCTSTR appData[] = { _T("application/json"),NULL };
  
      hResourceHandle = HttpOpenRequestA(hConnectHandle, _T("POST"), 
      _T("/trade/2.0/orders"), NULL, NULL, appData, 
      INTERNET_FLAG_RELOAD, 1);

      TCHAR postHead[46] = 
      "Content-Type:application/json;charset=utf-8\r\n";                  
      TCHAR postData[137] = 
      "{\"instrument\":\"AAPL.NASDAQ\",\"orderType\":\"stop\",
      \"side\":\"buy\",\"stopPrice\":\"130\",\"quantity\":\"6\",
      \"duration\":\"day\",\"accountId\":\"MIA4198.001\"}";
  
      //На этом этапе возникает проблема, до этого я ошибок не вижу:
      HttpSendRequestA(hResourceHandle, postHead, 45, postData, 136);
  
      //Далее вывожу сообщение об ответе. Respons должен быть 201 в случае 
      //успеха, либо 400, 500 в случае ошибки. Возвращает 0.
      char StatusCode[30] ="";
      DWORD StatusCodeLen = sizeof(StatusCode);
      HttpQueryInfo(hResourceHandle, HTTP_QUERY_STATUS_CODE , &StatusCode, 
      &StatusCodeLen, NULL);
      MessageBox(NULL, StatusCode, "Responce=201?!", MB_OK);
  
      //Получаю в ответ от сервера JSON.
      //Но это ответ на запрос api-demo.exante.eu/trade/2.0/orders.
      //Ответ на передачу мной JSON серверу должен быть другой и начинаться с 
      //{ "orderParameters": {"instrument": .....
      InternetReadFile(hResourceHandle, szData, sizeof(szData) - 1, 
      &dwBytesRead);
      DWORD dwBytesRead = 1024;
      TCHAR  szData[1024] = "";              
      szData[dwBytesRead];
      MessageBox(NULL, szData, "szData", MB_OK);
  
      szData[0] = 0;
      postData[0] = 0;
      dwBytesRead = 0;
                
      InternetCloseHandle(hResourceHandle);
      InternetCloseHandle(hConnectHandle);
      }

      InternetCloseHandle(hOpenHandle);
    }

~

В чем может быть причина? Могу-ли я передавать JSON открытым текстом или должен его упаковать? Опыта у меня 0 из 10. Документация API по этому примеру: https://api-live.exante.eu/api-docs/#operation/placeOrder Заранее спасибо.

Fiddler показывает такое, но как это трактовать я не знаю. Fiddler 4


Ответы (1 шт):

Автор решения: Дмитрий Маныкин

Вопрос решен, всем спасибо. Следующие строки должны выглядеть так:

hConnectHandle = InternetConnectA(hOpenHandle, "api-demo.exante.eu", INTERNET_DEFAULT_HTTPS_PORT, "a0bf5e14-d039-451b-a2ea-fc5cf778f7da", "kdyM5ITrvaMDie5YVrTi", INTERNET_SERVICE_HTTP, 0, 0); hResourceHandle = HttpOpenRequestA(hConnectHandle, _T("POST"), _T("/trade/2.0/orders"), HTTP_VERSION, NULL, NULL, INTERNET_FLAG_SECURE, 0);

→ Ссылка