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, и его текст в остальных случаях.
{ "status": 200, "body": { "tier": "pro" }, "text": null, "error_code": null }Вызов, который не получил ответа, оставляет status пустым и говорит причину в error_code:
{ "status": null, "body": null, "text": null, "error_code": "host_not_allowed" }Следующий узел читает ответ как nodes.<key>.output.body — здесь nodes.call.output.body.tier, если ключ узла — call. Вернуть ответ с источником Выход узла отвечает всем выходом.
Ошибки
На каждый вызов узел пишет в трассировку одно событие http_called. Событие называет метод, хост, путь в том виде, как его написал автор, — с незаполненными подстановками, — статус, время и размер ответа. Чем была заполнена подстановка, строка запроса и заголовки не пишутся. Вызов, который не дал ответа, несёт reason.
[
{ "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_allowed | Url узла «{node}» отсутствует в списке разрешённых (разрешены: {hosts}). |
http_scheme_not_https | «{node}» должен вызывать https. |
http_port_not_allowed | «{node}» может вызывать только порт 443. |
http_url_has_credentials | Url узла «{node}» содержит учётные данные. |
http_host_is_address_literal | «{node}» должен вызывать имя хоста, а не адрес. |
http_url_unparseable | Url узла «{node}» невозможно разобрать. |
http_url_bad_placeholder | В url узла «{node}» есть подстановка, которая не называет значения во входных данных, контексте или выходе узла, — вызов падал бы при каждом запуске. |
http_url_unknown_node | Url узла «{node}» читает «{path}», но узла «{ref}» во флоу нет. |
http_url_later_node | Url узла «{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