Как настроить webhook в n8n и проверить JSON
Принимаем POST-запрос в n8n, проверяем JSON и возвращаем HTTP 200 или 400. Различия Test URL и Production URL, авторизация и тесты.
Webhook в n8n запускает workflow по HTTP-запросу. Для первого подключения выбери метод POST, скопируй Test URL, включи ожидание тестового события и отправь JSON. После проверки опубликуй workflow и используй отдельный Production URL.
Соберём приёмник отзывов: он проверяет event_id и text, возвращает HTTP 200 для корректного события и HTTP 400 для ошибки формата. Когда этот участок заработает, к нему можно подключить классификацию с ИИ.
В примере webhook подтверждает проверку входа; он пока ничего не сохраняет и не запускает модель. Такая граница помогает сначала проверить транспорт. Код валидации и тестовые JSON проверены локально. Сам endpoint нужно запустить в своём n8n; настройки сверены с документацией.
1. Определи формат события
Скачай комплект JSON и кода. Корректный запрос в файле valid.json:
{
"event_id": "feedback-001",
"text": "В отчёте не хватает фильтра по дате."
}
Для учебного контракта event_id — строка до 80 символов из латинских букв, цифр, дефиса и подчёркивания. text — непустая строка до 2000 символов после удаления пробелов по краям. Это выбранные нами границы примера, а не лимиты n8n.
Стабильный event_id понадобится для защиты от повторов: отправитель должен повторно посылать тот же ID для того же события. Но наличие поля само по себе не обеспечивает дедупликацию.
2. Настрой Webhook
Создай новый workflow с узлом Webhook. Выбери HTTP Method = POST, Path = ai-feedback-demo, Respond = Using ‘Respond to Webhook’ Node.
Для входа включи Header Auth, создай credential с именем заголовка X-Demo-Key и случайным значением. Используй его только для этого упражнения. Header Auth проверяется до выполнения обработчика. Тестовый и рабочий адреса, режимы ответа и варианты авторизации описаны в справке Webhook.
Нажми Listen for Test Event. Копируй URL из своего узла целиком: домен, путь и префикс зависят от конфигурации экземпляра. Не заменяй webhook-test на webhook вручную, пока не готов перейти к опубликованному workflow.
3. Проверь входные данные
После Webhook добавь Code, язык JavaScript, режим Run Once for All Items. Входное тело находится в $input.first().json.body; рядом могут быть HTTP-заголовки и параметры URL. Передай следующий код:
const body = $input.first().json.body;
const isObject = body !== null && typeof body === 'object' && !Array.isArray(body);
const id = isObject && typeof body.event_id === 'string' ? body.event_id.trim() : '';
const text = isObject && typeof body.text === 'string' ? body.text.trim() : '';
const errors = [];
if (!/^[A-Za-z0-9_-]{1,80}$/.test(id)) errors.push('invalid_event_id');
if (!text || text.length > 2000) errors.push('invalid_text');
if (errors.length) {
return [{ json: { status: 400, response: { ok: false, errors } } }];
}
return [{ json: {
status: 200,
response: { ok: true, event_id: id, stage: 'validated' },
event: { event_id: id, text }
} }];
Это детерминированная проверка; модель для неё не требуется. Даже если отправитель передаст массив, число вместо текста или объект без нужных полей, код не должен принять событие за корректное. Оставь распознавание JSON включённым, без режима Raw Body.
Справка Code node объясняет режимы выполнения. В этом упражнении один HTTP-запрос даёт один проверяемый item.
4. Верни понятный ответ
Соедини Code с Respond to Webhook. Выбери Respond With = JSON. Для Response Body переключи поле в Expression и укажи {{ $json.response }}. В Options добавь Response Code = {{ $json.status }}.
Webhook → Code: validate → Respond to Webhook
Теперь ответ определяется результатом проверки. Для корректного тела ожидаем:
{"ok":true,"event_id":"feedback-001","stage":"validated"}
Клиенту не возвращаются ни credential, ни все заголовки запроса, ни весь внутренний item. Поле stage честно описывает выполненный шаг. Respond to Webhook отправляет один ответ на запрос; не добавляй несколько конкурирующих узлов ответа на одной выполняющейся ветке. Настройки описаны в документации узла.
5. Прогони тестовые запросы
Из папки с valid.json выполни команду, заменив адрес и тестовый ключ. Пример рассчитан на терминал macOS/Linux; в PowerShell используй curl.exe.
curl -i --request POST \
--header 'Content-Type: application/json' \
--header 'X-Demo-Key: REPLACE_WITH_YOUR_TEST_KEY' \
--data-binary @valid.json \
'https://YOUR-N8N-HOST/webhook-test/ai-feedback-demo'
Реальный ключ не сохраняй в общедоступном скрипте или репозитории. Для повторного теста при необходимости снова включи ожидание события в редакторе.
| Тест | Ожидаемое поведение |
|---|---|
valid.json |
HTTP 200, stage = validated |
empty-text.json |
HTTP 400, ошибка invalid_text |
invalid-id.json |
HTTP 400, ошибка invalid_event_id |
wrong-type.json |
HTTP 400, ошибка invalid_text |
| Нет X-Demo-Key или значение неверно | Отказ авторизации; Code не выполняется |
| Дважды отправлен один event_id | Два ответа validated: дедупликация ещё не добавлена |
Последняя строка — полезная проверка границы реализации. Если дальше будет списание денег, создание задачи или отправка письма, повтор события уже станет проблемой. До такого действия добавь устойчивое хранилище ID с уникальным ограничением и атомарной записью; проверка «найти, затем добавить» без блокировки может дать гонку.
6. Переключись на рабочий URL
Опубликуй workflow (в старом интерфейсе это может называться активацией), скопируй Production URL из узла и повтори корректный запрос. Результат рабочего запуска ищи в Executions, а не только на полотне редактора.
Если получаешь 404, сравни метод, путь и выбранный URL; затем проверь публикацию workflow. Если адрес за reverse proxy отображается неверно, сначала исправь внешний URL экземпляра по документации n8n. Если соединение зависает, убедись, что ветка выполнения доходит до Respond to Webhook.
Для следующего шага поставь перед ответом IF, пропускающий только status = 200, и подключи обработку отзыва с ИИ. После такого изменения пересмотри HTTP-ответ: он должен описывать фактически завершённую работу. Для долгой генерации лучше отдельная очередь с ID задания и проверкой статуса; немедленный HTTP 200 сам по себе не означает, что модель уже закончила.
Собери своего ИИ-агента и проверь результат
«AI Agents: от vibe coding к AI-команде»: desktop agents, MCP, skills, evals и harness. Отдельные воркшопы — от подключения инструментов до контроля качества.
7 практических воркшопов · записи · вопросы автору в чате
Посмотреть программу курса ↗