HTTP-запрос

Замороженный узел, который вызывает HTTPS-адрес из списка разрешённых хостов сервиса и ветвится по ответу, — в версиях, опубликованных с ним.

5 мин чтения

HTTP-запрос делает один HTTPS-вызов к API вне Slen и кладёт ответ в выполнение. Узел заморожен, если сервис не настроен иначе: палитра его не предлагает, а новая версия не может его содержать. Версия, опубликованная с ним, продолжает работать, и эта страница говорит, что узел в ней делает.

Узел
HTTP-запрос Заморожен
Тип
http_request
Категория
Выход
Порты
  • По умолчанию default подключение обязательно
  • Ошибка error подключение необязательно
Завершает путь
Нет
Заморожен
Больше не предлагается в палитре. Флоу, которые его уже используют, продолжают работать.

Что делает узел

Узел собирает один запрос из своих настроек и значений выполнения, делает вызов и читает ответ. Ответ со статусом 2xx выходит через По умолчанию. Всё остальное выходит через Ошибка: другой статус, включая перенаправление, — узел по нему не переходит; запрос, который узел не смог собрать; адрес, который сервис отклоняет; хост, до которого узел не достучался; ответ длиннее, чем узлу можно прочитать.

  • Адрес всегда https на порту 443, а его хост — имя из списка разрешённых хостов сервиса: сам этот хост или его поддомен. Список один на весь сервис, и задаёт его тот, кто запускает сервис. С пустым списком узел ничего не вызывает.

  • Перед каждым вызовом узел снова сверяет хост со списком и отклоняет хост, имя которого ведёт к непубличному адресу. Вызов не идёт через прокси.

  • Узел тратит время, а не деньги: он ничего не резервирует и ничего не списывает.

Когда использовать

Новая версия не может содержать этот узел, поэтому вы встречаете его в версии, опубликованной до того, как узел заморозили. Черновик, в котором он остался, не публикуется, пока узел не убран, — как читать эту проверку, говорит статья Публикация, версии и откат.

Чтобы передать в запрос данные другого API, вызовите этот API из своего приложения и отправьте его ответ во входе или в контексте запроса — Отправить запрос.

Настройки

НастройкаДля чего она
methodМетод запроса — GET, POST, PUT, PATCH или DELETE. GET, если не задан.
urlАдрес, который вызывает узел, — https, порт 443, хост из списка разрешённых хостов сервиса. В его пути и строке запроса могут стоять подстановки — пути в двойных фигурных скобках, которые заполняются значениями выполнения; в хосте — нет.
headersЗаголовки, которые отправляются с запросом, — имя и текстовое значение, не больше 10. Заголовок с учётными данными отклоняется.
body_fromПуть к значению, которое целиком отправляется телом, как JSON. Используется только с POST, PUT и PATCH; без него у запроса нет тела.
timeout_secondsСколько узел ждёт ответа, в секундах. Без этого ключа действует значение сервиса по умолчанию; больше потолка сервиса задать нельзя.
max_response_bytesСколько байт ответа читает узел. Более длинный ответ не читается. Без этого ключа действует значение сервиса по умолчанию; больше потолка сервиса задать нельзя.
  • Подстановка — это путь в двойных фигурных скобках, например {{input.customer_id}}: подстановки могут стоять в пути адреса и в его строке запроса, но не в хосте. Узел заполняет каждую значением по пути, закодированным для адреса. Число пишется как есть, а true и false — словами. Подстановка не заполняется, если путь ничего не нашёл или нашёл null, список или объект: тогда узел не делает вызова и выходит через Ошибка.

  • Путь в nodes называет узел, который выполняется раньше этого.

  • Узел просит JSON. С телом он отправляет Content-Type: application/json.

  • Заголовок с учётными данными — авторизацией, cookie, API-ключом — отклоняется: флоу хранится как обычный JSON, и такой заголовок держал бы секрет открытым текстом.

  • Если сервис не настроен иначе, узел ждёт ответа 5 секунд, но не дольше 15, и читает из него 65 536 байт, но не больше 262 144. Само соединение должно установиться за 3 секунды.

Порты

У узла два порта. По умолчанию обязателен: флоу, в котором он никуда не ведёт, не публикуется. Ошибка необязателен. Если он никуда не ведёт, а вызов не удался, выполнение заканчивается статусом failed с кодом http_request_failed.

Выход

Выход — это ответ: его статус, его тело, если тело — объект или список JSON, и его текст в остальных случаях.

JSON
{ "status": 200, "body": { "tier": "pro" }, "text": null, "error_code": null }

Вызов, который не получил ответа, оставляет status пустым и говорит причину в error_code:

JSON
{ "status": null, "body": null, "text": null, "error_code": "host_not_allowed" }

Следующий узел читает ответ как nodes.<key>.output.body — здесь nodes.call.output.body.tier, если ключ узла — call. Вернуть ответ с источником Выход узла отвечает всем выходом.

Ошибки

На каждый вызов узел пишет в трассировку одно событие http_called. Событие называет метод, хост, путь в том виде, как его написал автор, — с незаполненными подстановками, — статус, время и размер ответа. Чем была заполнена подстановка, строка запроса и заголовки не пишутся. Вызов, который не дал ответа, несёт reason.

JSON
[
  { "type": "http_called", "node_key": "call", "payload": { "method": "GET", "host": "api.example.com", "path": "/v1/customers/{{input.customer_id}}", "status": 404, "duration_ms": 182, "bytes": 61, "reason": null } },
  { "type": "http_called", "node_key": "call", "payload": { "method": null, "reason": "url_placeholder_unresolved" } },
  { "type": "http_called", "node_key": "call", "payload": { "method": null, "reason": "body_unresolved" } },
  { "type": "http_called", "node_key": "call", "payload": { "method": null, "reason": "url_unparseable" } },
  { "type": "http_called", "node_key": "call", "payload": { "method": "GET", "host": "api.example.com", "path": "/v1/plans", "status": null, "duration_ms": 0, "bytes": 0, "reason": "egress_not_configured" } },
  { "type": "http_called", "node_key": "call", "payload": { "method": "GET", "host": "api.example.com", "path": "/v1/plans", "status": null, "duration_ms": 0, "bytes": 0, "reason": "host_not_allowed" } },
  { "type": "http_called", "node_key": "call", "payload": { "method": "GET", "host": "203.0.113.7", "path": "/v1/plans", "status": null, "duration_ms": 0, "bytes": 0, "reason": "host_is_address_literal" } },
  { "type": "http_called", "node_key": "call", "payload": { "method": "GET", "host": "api.example.com", "path": "/v1/plans", "status": null, "duration_ms": 12, "bytes": 0, "reason": "host_unresolvable" } },
  { "type": "http_called", "node_key": "call", "payload": { "method": "GET", "host": "api.example.com", "path": "/v1/plans", "status": null, "duration_ms": 9, "bytes": 0, "reason": "address_not_public" } },
  { "type": "http_called", "node_key": "call", "payload": { "method": "GET", "host": "api.example.com", "path": "/v1/plans", "status": null, "duration_ms": 5004, "bytes": 0, "reason": "unreachable" } },
  { "type": "http_called", "node_key": "call", "payload": { "method": "GET", "host": "api.example.com", "path": "/v1/plans", "status": 200, "duration_ms": 1310, "bytes": 2048, "reason": "request_failed" } },
  { "type": "http_called", "node_key": "call", "payload": { "method": "GET", "host": "api.example.com", "path": "/v1/plans", "status": 200, "duration_ms": 240, "bytes": 65537, "reason": "response_too_large" } }
]
reasonЧто произошло
url_placeholder_unresolvedПодстановку адреса не удалось заполнить. Ничего не вызывалось
body_unresolvedПуть тела ничего не нашёл. Ничего не вызывалось
url_unparseableАдрес не читается. Ничего не вызывалось
egress_not_configuredСписок разрешённых хостов сервиса пуст
host_not_allowedХоста больше нет в списке разрешённых
host_is_address_literalАдрес называет IP-адрес, а не хост
host_unresolvableИмя хоста не ведёт ни к одному адресу
address_not_publicИмя хоста ведёт к непубличному адресу
unreachableСоединение не установилось, или ответ не пришёл за время узла
request_failedВызов оборвался после того, как соединение установилось
response_too_largeОтвет длиннее, чем узлу можно прочитать

У ответа со статусом вне 2xx нет reason: что произошло, говорит статус.

Черновик, в котором есть этот узел, отклоняется с кодом node_type_frozen — Проверки при публикации. Настройки узла тоже проверяются, при проверке флоу и при его публикации:

В API запись issues называет такую проверку в params.detail; её code — invalid_node_config.

ПроверкаСообщение в конструкторе
http_needs_urlУзлу «{node}» нужен url.
http_templated_host«{node}» не может подставлять хост через шаблон.
http_egress_not_configured«{node}» не может вызывать наружу: не настроен ни один исходящий хост.
http_host_not_allowedUrl узла «{node}» отсутствует в списке разрешённых (разрешены: {hosts}).
http_scheme_not_https«{node}» должен вызывать https.
http_port_not_allowed«{node}» может вызывать только порт 443.
http_url_has_credentialsUrl узла «{node}» содержит учётные данные.
http_host_is_address_literal«{node}» должен вызывать имя хоста, а не адрес.
http_url_unparseableUrl узла «{node}» невозможно разобрать.
http_url_bad_placeholderВ url узла «{node}» есть подстановка, которая не называет значения во входных данных, контексте или выходе узла, — вызов падал бы при каждом запуске.
http_url_unknown_nodeUrl узла «{node}» читает «{path}», но узла «{ref}» во флоу нет.
http_url_later_nodeUrl узла «{node}» читает «{path}», но «{ref}» не выполняется раньше него.
http_unsupported_method«{node}» использует неподдерживаемый метод.
http_headers_not_mapЗаголовки «{node}» должны быть набором пар «имя — значение».
http_too_many_headers«{node}» задаёт больше {max} заголовков.
http_header_unusable_nameУ «{node}» есть заголовок с недопустимым именем.
http_header_forbidden«{node}» не может задавать «{header}»: граф хранится открытым текстом, поэтому такие данные не останутся секретом.
http_header_needs_valueЗаголовку «{header}» узла «{node}» нужно текстовое значение.
http_invalid_timeout«{node}» может ждать от 1 до {max} секунд.
http_invalid_max_bytes«{node}» может прочитать не больше {max} байт.
http_invalid_body_fromПуть тела запроса «{node}» должен указывать внутрь выполнения.
http_body_from_unknown_nodeТело запроса «{node}» читается из «{path}», но узла «{ref}» во флоу нет.
http_body_from_later_nodeТело запроса «{node}» читается из «{path}», но «{ref}» не выполняется раньше него.

Пример

  • Запрос — По умолчанию → HTTP-запрос
  • HTTP-запрос — По умолчанию → Вернуть ответ
  • HTTP-запрос — Ошибка → Отклонить запрос

Узел вызывает адрес из своих настроек с клиентом запроса в пути. Вернуть ответ отвечает выходом узла. Если вызов не удался, выполнение идёт в Отклонить запрос и заканчивается статусом rejected с кодом, на который настроен этот узел.

Собрано из openapi b070e1f, sdk contract 5cc7055, php ae4a53b, node 84bc62d