TypeScript SDK: Сбор из JSON и работа с параметрами
Иногда сайт отдаёт данные уже в JSON. Это обычно проще, чем искать текст в HTML. Используйте адрес только того источника, с которым работает ваш сценарий: ctx.http() применит его сетевые настройки и ограничения.
Ответ JSON
await ctx.http().get(url) возвращает Response; response.json() разбирает уже полученное тело локально. Если ответ не JSON, метод выбросит ошибку. Перед чтением полей проверьте структуру ответа.
async function run(ctx: Akmelo.Context): Promise<void> {
const url = ctx.param('api_url', '');
if (!url) ctx.abort('Укажите адрес данных');
const response = await ctx.http().withHeaders({ Accept: 'application/json' }).get(url);
if (!response.ok()) ctx.fail(`Источник ответил HTTP ${response.status}`);
const payload = response.json<{ items?: Akmelo.Row[] }>();
if (!payload || !Array.isArray(payload.items)) ctx.fail('Нет списка товаров');
for (const item of payload.items) {
const sku = String(item.sku ?? '');
if (!sku) continue;
const price = ctx.text().money(item.price);
ctx.emit({ sku, name: String(item.name ?? ''), price }, sku);
}
}
ctx.json(text) нужен, когда JSON уже находится в строковом поле документа или ответа браузера. У метода нет параметра глубины. Для частичного ответа проверьте наличие ключа, а не полагайтесь на то, что он всегда будет.
Параметры и секреты
ctx.param(name, fallback) возвращает один параметр, ctx.params() — весь объект параметров. Имена входов берите из настроек сценария. Именованный секрет читается отдельно через await ctx.credential(name); не кладите его в результаты и журнал. Если адресов несколько, передайте их массивом и проверяйте тип до обхода.
Ошибки JSON и повтор
Не вызывайте response.json() до проверки статуса: страница ошибки часто содержит HTML. Если схема источника поменялась, завершите прогон через ctx.fail() с понятной причиной. Ошибку разбора JSON можно поймать, но не подменяйте её пустым списком: иначе будет казаться, что товары закончились.