MyChat Scripts: функция HTTPSendPostMessageAsync, отправить сетевой POST-запрос в асинхронном режиме
Отправить 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"): Скрипт выполнен успешно.