# Ответы (/ru/docs/requests/responses)

Всё, что присылает сервер, показывается в области ответа: тело в подходящем виде, заголовки, cookie, сообщение в том
виде, в каком оно пришло, его байты в hex и в передаче. Статус и время находятся в строке под строкой URL. Тела
записываются на диск по мере поступления, поэтому ответ в сотни мегабайт открывается так же быстро, как маленький.

<Shot id="requests-http-response-tree" alt="Ответ List products в виде JSON-дерева: над значением наведён указатель, видны кнопки «Скопировать значение» и «Сохранить в переменную»" />

## Статус, время и размер [#status-time-and-size]

После отправки строка под строкой URL показывает:

- **статус**, окрашенный по классу (2xx, 3xx, 4xx, 5xx); запрос, не получивший ответа, показывает вместо него **Ошибка**
  или **Отменено**;
- полосу для каждой **фазы** обмена, которая растёт, пока выполняется запрос;
- **общее время**.

Наведите указатель на строку, и откроется карточка с подробностями:

| В карточке | Что она говорит |
| --- | --- |
| Статус | Код состояния и пояснение. |
| **Время** | Общее время обмена. |
| **Размер** | Размер тела; пока тело поступает — сколько пришло из скольких. |
| **Кодирование** | Сжатие и размеры до и после декодирования, например `br, 12 KB → 48 KB`, либо что декодировать не удалось. |
| **3 перенаправления** | Выполненные перенаправления; нажмите, чтобы увидеть статус, метод, адрес и время каждого перехода. |
| Проверки | Сколько проверок запроса пройдено. |
| **Повторно использованное соединение** | Запрос ушёл по соединению, оставленному открытым после предыдущего: без времени DNS, подключения и TLS. |
| TLS | Версия и протокол TLS, например `TLS 1.3 · h2`. Нажмите, чтобы увидеть сертификаты: субъект, **Издатель**, даты **Действителен** и **Имена**. Оранжевый открытый замок означает, что проверка была выключена. |
| **Предложен HTTP/3** | Сервер предложил HTTP/3 через `Alt-Svc`; см. [версию HTTP](/docs/requests/settings#http-version). |
| Адрес | IP-адрес и порт сервера. |
| Шкала времени | **DNS**, **Соединить**, **TLS**, **Ожидание** (до первого байта ответа) и **Получение**, у каждой своё время. |

Если запрос отправили повторно (по новому соединению или по HTTP/1.1), карточка объясняет почему. Если он завершился
ошибкой, карточка показывает её.

## Вкладки ответа [#the-response-tabs]

| Вкладка | Что показывает |
| --- | --- |
| **Тело** | Тело в выбранном виде. |
| **События** | Server-Sent Events и другие потоки событий, по событию в строке. См. [WebSocket и SSE](/docs/requests/websocket-and-sse). |
| **Тесты** | Результаты проверок и тестов скриптов запроса с числом, например `3/4`. |
| **Консоль** | Что записали в журнал скрипты запроса; только если скрипты выполнялись. См. [Скрипты и тесты](/docs/requests/scripts-and-tests). |
| **Заголовки** | Заголовки ответа с числом. |
| **Cookie** | Отправленные и установленные cookie и хранилище cookie окна. |
| **Исходный** | Ответ как одно сообщение HTTP: строка состояния, заголовки, пустая строка и тело. |
| **Hex** | Байты тела. |
| **Передача** | Отправленные и полученные байты точно в том виде, в каком они прошли по соединению. |

## Виды тела [#body-views]

Выберите вид в строке вверху вкладки **Тело**:

| Вид | Что показывает |
| --- | --- |
| **Текст** | Тело как оно пришло, окрашенное по типу содержимого. |
| **JSON** | JSON с отступами. |
| **JSON-дерево** | JSON в виде дерева, которое можно раскрывать и сворачивать. |
| **XML** | XML в виде дерева элементов, атрибутов и текста. |
| **Форма** | Тело URL-encoded, прочитанное как дерево. |
| **MessagePack** | Тело MessagePack, прочитанное как дерево. |
| **Просмотр** | Изображения, PDF, аудио и видео через «Быстрый просмотр». |

Любой вид доступен для любого тела, поэтому ответ с неверным типом содержимого всё равно можно прочитать как то, чем он
является. Тип содержимого определяет вид, в котором открывается ответ, а Echolot запоминает вид, который вы выбрали для
каждого типа тела: после того как вы выбрали **JSON-дерево** для одного ответа JSON, следующие откроются в дереве.

HTML и скрипты никогда не выполняются и не отображаются. **Просмотр** и **Открыть в программе по умолчанию** показывают
их как текст.

Длинные строки в текстовых видах прокручиваются вбок. Нажмите кнопку переноса или выберите
**Вид › Переносить длинные строки**, чтобы переносить их. **Вид › Увеличить код** (<kbd>⌘</kbd><kbd>+</kbd>), **Уменьшить код**
(<kbd>⌘</kbd><kbd>-</kbd>) и **Реальный размер кода** (<kbd>⌘</kbd><kbd>0</kbd>) меняют размер кода везде.

## Деревья JSON и XML [#json-and-xml-trees]

Деревья показывают ключ или индекс каждого значения, его тип и значение; свёрнутый объект или массив показывает, сколько
в нём элементов. Массив из более чем 1000 элементов разбивается на диапазоны вроде `[0 … 999]`, поэтому даже огромный
массив открывается сразу.

Наведите указатель на значение, чтобы увидеть его кнопки:

- **Открыть в браузере** — для значения, которое является веб-адресом;
- **Скопировать значение**;
- **Сохранить в переменную…**, которая сохраняет значение в переменную и, если хотите, обновляет его после каждой
  отправки. См. [Захваты из ответа](/docs/requests/captures#store-a-value-from-the-response).

Щёлкните строку правой кнопкой, чтобы увидеть больше:

- В дереве JSON: **Скопировать путь** (JSONPath к значению, например `$.items[0].sku`), **Скопировать значение** и
  **Добавить проверку**, которая добавляет на вкладку **Тесты** проверку, что значение равно текущему.
- В дереве XML: **Скопировать XPath** и **Скопировать значение**.

Наведите указатель на значение — адрес изображения, и рядом откроется миниатюра. Изображение загружается так же, как
браузер загружает картинку: без ваших cookie и учётных данных, до 10 МБ и без записи в историю. Значения
`data:image/…` показываются без какого-либо запроса. Наведите на значение, похожее на дату (время Unix в секундах,
миллисекундах, микросекундах или наносекундах либо отметка времени ISO 8601), и оно покажется как читаемая дата.

Дерево **XML** принимает тела до 50 МБ, а **Форма** и **MessagePack** — до 64 МБ. Для больших используйте **Текст** и
поиск.

## Поиск [#find]

Нажмите <kbd>⌘</kbd><kbd>F</kbd> (**Запрос › Найти в теле**) или нажмите на лупу.

- В **Текст** и **JSON** введите, что искать. **Aa** учитывает регистр; **.\*** делает запрос регулярным выражением.
  Панель показывает, где вы находитесь, например `3 of 1,204`. Нажмите <kbd>↩</kbd> или <kbd>⌘</kbd><kbd>G</kbd> для
  следующего совпадения и <kbd>⇧</kbd><kbd>⌘</kbd><kbd>G</kbd> для предыдущего. Отмечается до 10 000 совпадений; если
  их больше, у числа появляется `+`.
- В **JSON-дерево**, **Форма** и **MessagePack** панель принимает JSONPath вроде `$.items[0]` и переходит к этому
  значению. Если там ничего нет, она сообщает **Не найдено**.

Нажмите <kbd>Esc</kbd>, чтобы закрыть панель.

## Большие ответы [#large-responses]

Echolot никогда не держит тело в памяти. Он пишет его в файл по мере поступления, а просмотрщики читают только ту часть,
что на экране:

- Первые строки показываются, пока остальное ещё приходит. Пока тело загружается, карточка с подробностями показывает,
  сколько уже пришло.
- **JSON** начинает форматироваться с отступами, как только начинается тело, и следует за ним по мере роста.
- **JSON-дерево** строит только те строки, которые вы раскрываете.
- Поиск ищет по всему телу на диске.

Попробуйте на **Catalog › Export the catalog** в Alpenglow: 40 000 товаров, около 14 МБ.

Тела хранятся на диске до размера, заданного в **Настройки › Хранилище › Хранить тела ответов до**; сверх него удаляются
давно не использованные, кроме тел, открытых во вкладках. Старый ответ, чьё тело удалено, сообщает, что тело этого
ответа больше не хранится. См. [Хранилище и шифрование](/docs/workspaces/storage-and-encryption).

## Заголовки [#headers]

Вкладка **Заголовки** перечисляет заголовки ответа в порядке их поступления. Наведите указатель на строку или выберите
её и нажмите <kbd>Пробел</kbd> (<kbd>↑</kbd> и <kbd>↓</kbd> для перехода), чтобы увидеть значение целиком, для чего
нужен заголовок и что говорит его значение. Щёлкните заголовок правой кнопкой для **Скопировать значение**,
**Скопировать заголовок** и **Добавить проверку**, которая добавляет на вкладку **Тесты** проверку этого заголовка.

## Cookie [#cookies]

Вкладка **Cookie** состоит из трёх частей:

- **Отправлен с запросом**: cookie, которые ушли, и откуда взялся каждый.
- **Установлен ответом**: каждый `Set-Cookie` с атрибутами и предупреждением, если хранилище его отклонило.
- **Хранится в этом окне**: всё в хранилище cookie окна. Удалите одно его кнопкой или все через **Очистить все**.

Если для запроса выключено **Отправлять и сохранять cookie**, вкладка сообщает об этом. См.
[Cookie](/docs/requests/settings#cookies).

## Исходный, Hex и Передача [#raw-hex-and-wire]

- **Исходный** показывает ответ как одно сообщение: строка состояния, заголовки, пустая строка, затем декодированное тело
  (первые 64 МБ; на вкладке **Тело** есть всё).
- **Hex** показывает байты тела: смещения, по 16 байт в строке двумя группами и их ASCII. Выделяйте байты мышью или
  клавишами со стрелками и <kbd>⇧</kbd>; копирование даёт пары hex или текст, если вы выделяли в столбце ASCII.
- **Передача** показывает байты точно так, как они прошли по соединению: выберите **Отправлено** или **Получено**. Вы
  видите заголовки в том виде, как они оформлены, и сжатое тело до декодирования. В каждом направлении сохраняется до
  1 МБ; вкладка сообщает, если показывает только начало.

## Сохранение и отправка другим [#save-and-share]

Нажмите кнопку сохранения вверху справа на вкладке **Тело**:

- **Сохранить тело…** записывает тело в файл (декодированное).
- **Открыть в программе по умолчанию** открывает его в приложении, которое ваш Mac использует для этого типа.
- **Сохранить закодированное тело…** записывает тело в том виде, в каком оно пришло, ещё сжатым; только для сжатых
  ответов.
- **Экспортировать обмен в HAR…** записывает запрос и ответ как файл HAR.

Чтобы поделиться запросом, а не ответом, используйте **Запрос › Скопировать как cURL** (<kbd>⌥</kbd><kbd>⌘</kbd><kbd>C</kbd>)
или **Запрос › Сгенерировать код…** (<kbd>⌥</kbd><kbd>⌘</kbd><kbd>G</kbd>). См. [Запросы HTTP](/docs/requests#send-and-cancel).

## Прошлые ответы и сравнение [#earlier-responses-and-comparing]

Каждая отправка сохраняется в истории. Кнопка с часами и числом в конце строки под строкой URL открывает ответы этого
запроса: у каждого статус, время, кто его отправил (вы, прогон или агент), длительность и размер.

<Shot id="requests-http-response-history" alt="Всплывающая панель истории ответов List products со списком прошлых ответов, их статусом, временем, источником, длительностью и размером" />

- Нажмите ответ, чтобы показать его. Панель над областью ответа сообщает **Прошлый ответ**; **Показать последний ответ**
  возвращает обратно.
- Чтобы сравнить два ответа, покажите один, затем наведите указатель на другой в списке и нажмите его кнопку сравнения
  или нажмите **Сравнить с последним** на панели **Прошлый ответ**. Сравнение показывает, что добавлено и удалено.
- **Очистить историю этого запроса…** в меню списка удаляет историю этого запроса.

Историю всего рабочего пространства см. в разделе [История](/docs/workspaces/history).

## Если запрос не удался [#when-a-request-fails]

Если ответ не пришёл, область показывает ошибку, например **Время ожидания запроса истекло**, и **Повторить**. Могут
появиться ещё две кнопки:

- **Просмотреть скрипты…**, когда скрипты запроса пришли не из Echolot и требуют вашего доверия, прежде чем
  выполняться. См. [Скрипты и тесты](/docs/requests/scripts-and-tests).
- **Разрешить доступ…** в версии из App Store, когда запрос называет файл, который приложению пока нельзя читать.
