ym88659208ym87991671
$fetch | Документация для разработчиков
Skip to main content

$fetch

Обновлено 26 августа 2022

Сервис для выполнения асинхронных запросов к сценарию на внешнем сервере.

Сервис подключен по умолчанию во все новые проекты. Вы также можете подключить его в существующие проекты, в файле chatbot.yaml:

scriptsPreLoad:
global:
- /jsapi/fetch.js
note

Несколько последовательных запросов к внешнему серверу можно сделать с помощью последовательного вызова методов then() и catch().

$fetch.query(url, settings)

Выполняет запросы к внешнему серверу.

Параметры:

  • url — адрес сервера в виде строки, может содержать параметры, которые будут заполнены из поля query, переданного в параметре settings.

  • settings — валидный JSON с параметрами запроса:

    • method — http-метод запроса: GET, POST, PUT и т.д.
    • query — параметры запроса для подстановки в url.
    • body — тело запроса.
    • form — форма.
    • headers — http-заголовки.
    • datаType — тип возвращаемых данных: json, xml или text.
    • timeout — таймаут выполнения запроса в миллисекундах.

Возвращаемый объект имеет следующие поля:

  • isOk — при успешном выполнении запроса принимает значение true. При ошибке внутри сервиса или при истечении таймаута принимает значение false.
  • response — полный дамп ответа. При ошибке внутри сервиса или при истечении таймаута запроса принимает значение {}. Может быть использован для получения http-заголовков.
  • error — строка с описанием ошибки. В случае успешного запроса принимает значение undefined. При истечении таймаута принимает значение Read timed out
  • status — числовой код состояния http (например, 200 или 401). При ошибке внутри сервиса или при истечении таймаута запроса принимает значение -1.

Обратите внимание на поведение http-вызовов при различных datаType и Content-Type:

Content-TypedataTypeПоведение
заданзаданИсходящему запросу устанавливается заголовок Content-Type с заданным значением.

Ответ от сервера обрабатывается в соответствии с заданным форматом.
заданне заданИсходящему запросу устанавливается заголовок Content-Type с заданным значением.

Ответ от сервера обрабатывается в формате, полученным в заголовке ответа Content-Type.
не заданзаданИсходящему запросу устанавливается заголовок Content-Type со значением определяемым по dataType:

json → application/json,
xml → application/xml,
text → text/plain,
другое → application/json.

Ответ от сервера обрабатывается в соответствии с заданным форматом.
не заданне задан,
guess
Исходящему запросу устанавливается заголовок Content-Type: application/json.

Ответ от сервера обрабатывается в формате, полученным в заголовке ответа Content-Type.

Для вызова метода API, который принимает входные параметры в формате HTML-форм, в параметрах http-вызова используется объект form вместо body.

Такой вызов будет иметь заголовок Content-Type со значением application/x-www-form-urlencoded и соответствующим образом закодированные поля формы в теле запроса.

caution

Так как поля формы передаются в теле запроса, использование метода GET не предусмотрено.

Примеры

В примере ниже $fetch.query делает запрос, по указанному url с заданными параметрами:

state: getId
q!: запрос
script:
var url = "https://example.ru/patch";
var settings = {method: "PATCH"};
$fetch.query(url, settings)
.then(function (response) {
if (response.isSuccessful()) {
$temp.answer = response.serialize();
} else {
$temp.answer = response.serialize();
}
$jsapi.log("$$$$$$$ log: " + toPrettyString($temp.answer));
});
a: id = {{ toPrettyString($temp.answer.content) }}.

$fetch.get(url, settings)

Возвращает данные с внешнего сервера.

Эквивалентен вызову $fetch.query(url, settings), при условии, что settings.method == 'GET'.

Параметры:

  • url — адрес сервера в виде строки, может содержать параметры, которые будут заполнены из поля query, переданного в параметре settings.
  • settings — валидный JSON с параметрами запроса.

Примеры

patterns:
$city = (москв*:moscow/питер*:saint_petersburg) || converter = function($pt){return $pt.value.replace("_","%20");}

state: Weather
q!: Сколько градусов в $city
script:
var q = $parseTree.value;
var url = "https://api.apixu.com/v1/current.json?key=" + $injector.wheatherApiKey + "&q=" + q;
var response = $fetch.get(url);
if (response.isOk) {
$temp.degree = response.data.current.temp_c;
}
a: Сейчас {{ $temp.degree }}°C.

$fetch.post(url, settings)

Передает данные на внешний сервер.

Эквивалентен вызову $fetch.query(url, settings), при условии, что settings.method == 'POST'.

Параметры метода:

  • url — адрес внешнего бэкенда.
  • settings — валидный JSON с данными для обработки в бэкенде.

Пример

state: UsingNewFetchMethod
script:
function successHandlerParseResponseJson(response) {
log("Выполнение функции successHandlerParseResponseJson() завершено");
const state = response.json().content.array[0].state; // Обработка полученного ответа
$temp.answerToUserString = "Ответ пользователю на основе результатов запроса к внешнему бэкенду: " + state;
}

function errorHandler(error) {
log("Выполнение функции errorHandler() завершено");
return "Всё сломалось. Ошибка выполнения запроса. Вот ошибка: " + error;
}

//Адрес внешнего бэкенда
var url = "http://mockserver/another/back";

//Данные для обработки в бэкенде
var options = {
dataType: 'json',
headers: {
'Content-Type': 'application/json',
},
body: {},
};

//Вызов метода
$fetch.post(url, options)
.then(successHandlerParseResponseJson)
.catch(errorHandler);

log("Выполнение всего скрипта завершено");

a: {{$temp.answerToUserString}}

Несколько последовательных запросов к внешнему серверу можно сделать с помощью последовательного вызова методов then() и catch().

В этом случае скрипт выполнится до конца, после чего будут выполнены зарегистрированные колбэки. Сценарий перейдет к следующему шагу после выполнения всех отложенных функций.

Последовательность вывода в консоль при выполнении кода:

//При успешном запросе

Выполнение всего скрипта завершено

Выполнение функции successHandlerParseResponseJson() завершено

//При ошибке

Выполнение всего скрипта завершено

Выполнение функции errorHandler() завершено

Полученные ответы можно обрабатывать как с помощью тэга a, так и с помощью метода $reactions.answer()

$fetch.put(url, settings)

Изменяет данные на внешнем сервере.

Эквивалентен вызову $fetch.query(url, settings), при условии, что settings.method == 'PUT'.

$fetch.delete(url, settings)

Удаляет данные на внешнем сервере.

Эквивалентен вызову $fetch.query(url, settings), при условии, что settings.method == 'DELETE'.

$fetch.all(iterable)

Возвращает промис, который выполнится тогда, когда будут выполнены все промисы, переданные в виде перечисляемого аргумента, или отклонен любой из переданных промисов.

В параметр передается перечисляемый объект, например массив.

Пример

var first = $fetch.post('http://example1.ru')
.then(function(response) {
if (response.status != 200) {
throw "example1 failed: " + response.status;
}
$jsapi.log('first then');
return response.json();
});

var second = $fetch.post('http://example2.ru')
.then(function(response) {
if (response.status != 200) {
throw "example2 failed: " + response.status;
}
$jsapi.log('second then');
return response.json();
});

$fetch.all([first, second])
.then(function(jsons) {
$jsapi.log("success");
})
.catch(function (error) {
$jsapi.log(error);
})

$jsapi.log('scenario');

Последовательность вывода в консоль при выполнении кода:

scenario
second then
first then
success

$fetch.allSettled(iterable)

Возвращает промис, который исполняется когда все полученные промисы завершены (исполнены или отклонены), содержащий массив результатов исполнения полученных промисов.

В параметр передается перечисляемый объект, например массив.

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней