Надіслати HTTP POST-запит асинхронно. Функція одразу повертає ключ завдання, не блокуючи виконання скрипта.


Асинхронні функції HTTP не повертають відповідь сервера відразу. Вони запускають запит в окремому потоці і повертають рядковий ключ, яким готовий результат пізніше можна отримати з внутрішнього кешу пам'яті сервера через MemCacheExists() і MemCacheGet() пізніше.


Синтаксис

function HTTPSendPostMessageAsync(const AURL, ABody, AHeaders: string; const ATimeOut: integer): string;

 

Параметри та значення, що повертаються

Параметр

Тип

Значення

AURL

string

адреса, куди слід надсилати запит. Підтримується як http, і https. Ви можете вказати будь-який порт для підключення, наприклад, https://yourserver.com:8080/myservice/

ABody

string

тіло POST-запиту;

AHeaders

string

спеціальні заголовки (якщо потрібно). Розділяються CRLF, якщо потрібно більше одного. Зазвичай, якщо сервіс цього не вимагає, порожній рядок;

ATimeOut

integer

час у мілісекундах, максимальний час для очікування на відповідь віддаленого сервера.

 

Результат функції

Рядковий ключ, за яким пізніше можна отримати результат через MemCacheGet(). Якщо запит ще не завершено, відповідний запис у кеші може бути відсутнім.

 

Пример

var
  sKey, sBody, sResult, sData, sReqID: string;
  i: integer;
begin
  sReqID := CreateGUIDString;
  sBody := '{}';
  JSONSetString(sBody, 'event', 'user_login');
  JSONSetString(sBody, 'request_id', sReqID);
  sKey := HTTPSendPostMessageAsync(
    'https://httpbin.org/post',
    sBody,
    'Content-Type: application/json' + CRLF +
    'Accept: application/json',
    3000);
  mLogScript(sKey, 'Key');
       // Чекаємо появи результату в кеші, максимум 3 секунди, 
       // код для прикладу, подібні цикли з ScriptSleep у проді - погана ідея
  for i := 1 to 30 do begin
    if MemCacheExists(sKey) then begin
      sResult := MemCacheGet(sKey);
      mLogScript(sResult, 'Result'); 
      if JSONValid(sResult) then begin
        if JSONGetString(sResult, 'data', sData) = 0 then
          mLogScript('POST body accepted: ' + sData, 'HTTP POST ASYNC');
      end
      else
        mLogScript('Invalid JSON: ' + sResult, 'HTTP POST ASYNC');
      break;
    end;
    ScriptSleep(100);
  end;
end.


Результат роботи скрипту

[19:28:24] (Log "PostMessageAsync"): [Key] httppost_async{3f996968-6227-4cfe-a2b9-ffebe65a3644}21032026192824156

[19:28:24] (Log "PostMessageAsync"): [Result] { "args": {}, "data": "{\"request_id\":\"{698B5999-CCF1-4419-81A2-2C455FF1467F}\",\"event\":\"user_login\"}", "files": {}, "form": {}, "headers": { "Accept": "application/json", "Content-Length": "76", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Mozilla/4.0 (compatible; Synapse)", "X-Amzn-Trace-Id": "Root=1-69bed538-18d2c272565edcc45622c527" }, "json": { "event": "user_login", "request_id": "{698B5999-CCF1-4419-81A2-2C455FF1467F}" }, "origin": "95.67.34.140", "url": "https://httpbin.org/post" }

[19:28:24] (Log "PostMessageAsync"): [HTTP POST ASYNC] POST body accepted: {"request_id":"{698B5999-CCF1-4419-81A2-2C455FF1467F}","event":"user_login"}

[19:28:24] (Run "PostMessageAsync"): Час виконання скрипту: 576 мс

[19:28:24] (Run "PostMessageAsync"): Скрипт виконано успішно.

 

Дивитися ще

CreateGUIDString

CRLF

JSONGetString

JSONSetString

JSONValid

MemCacheExists

MemCacheGet

mLogScript

ScriptSleep