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