
## Что можно получить {#overview}

Исходное тело запроса и тело ответа конкретной попытки — разные файлы. Ответы сохраняются только если отправка включала `save_response_body=true`. По умолчанию флаг выключен; включение для нового задания не восстанавливает старый несохранённый ответ.

Диагностика и заголовки загружаются отдельно от тел. Указание размера в карточке не означает, что тело уже скачано или доступно.

## В кабинете {#dashboard}

Откройте карточку **Outbound → Requests**. **Download request body** скачивает исходное тело. **Download** у завершённой попытки скачивает сохранённый ответ. Если тело не сохранено или ещё недоступно, кнопка может отсутствовать и вместо неё показано состояние.

Во время скачивания **Cancel download** отменяет только чтение файла; это не отмена задания или HTTP-попытки. **Refresh** и уход со страницы также отменяют текущие загрузки. Полученный файл не встраивается в страницу как HTML получателя.

![Download request body для исходного тела и Download для ответа попытки Outbound](/images/docs/outbound/request-success-en.jpg)

*Исходное тело и ответ попытки скачиваются разными кнопками; полнота ответа показана в Response state. Демонстрационный кабинет, английский интерфейс.* [Открыть полный размер](/images/docs/outbound/request-success-en.jpg).

## Выберите попытку {#attempt}

Сначала прочитайте [сводку](/ru/docs/outbound/diagnostics), найдите завершённую попытку в `snapshot.attempts` и возьмите её `attempt_id`. Не подставляйте номер попытки вместо UUID. Проверьте её `body_bytes_stored`, `body_bytes_read`, `body_truncated` и `read_complete`.

## Исходное тело через API {#request-body}

```bash
curl --fail --silent --show-error \
  --header "Authorization: Bearer $ADAL_API_TOKEN" \
  --output request-body.bin \
  "$ADAL_API_URL/outbound/requests/$ADAL_REQUEST_ID/body"
```

Ответ — исходные бинарные байты, а не JSON и не base64. В примере быстрого старта файл содержит `hello`, а не `aGVsbG8=`. Пустое исходное тело допустимо.

## Ответ попытки через API {#response-body}

```bash
curl --fail --silent --show-error \
  --header "Authorization: Bearer $ADAL_API_TOKEN" \
  --output response-body.bin \
  "$ADAL_API_URL/outbound/requests/$ADAL_REQUEST_ID/attempts/$ADAL_ATTEMPT_ID/response/body"
```

Оба GET требуют API-токен, не принимают query и непустое тело запроса. API также поддерживает HEAD на путях тел для чтения заголовков, но HEAD не доказывает получение полного файла клиентом.

## Полнота {#completeness}

Не принимайте файл за полный только потому, что он появился на диске. Проверьте успешное завершение клиента, ожидаемую длину при наличии Content-Length и отсутствие обрыва потока. При ошибке не используйте частично записанный файл как готовый результат. Ответ без Content-Length сам по себе не является ошибкой: поток может передаваться chunked.

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

## Недоступность и ошибки {#unavailable}

| Ответ чтения                  | Значение и действие                                            |
|-------------------------------|----------------------------------------------------------------|
| `409 response_body_not_saved` | Сохранение было выключено; позднее тело не появится            |
| `409 not_yet_available`       | Ещё не готово; проверьте попытку и повторите чтение позднее    |
| `409` с `duplicate_of`        | Читать данные оригинала, не дубля                              |
| `410`                         | Срок HTTP-данных истёк                                         |
| `404`                         | Проверить request/attempt ID, владельца и существование данных |
| `503` до начала ответа        | Временный отказ чтения; повторить чтение, а не отправку        |

После начала потока ошибка может проявиться обрывом соединения без JSON-ошибки в конце файла. Поэтому нельзя полагаться только на изначальный HTTP-код `200`.

## Хранение, расход и безопасность {#retention}

Скачивание не продлевает срок хранения и не создаёт новую отправку. Истечение не возвращает учтённые байты. Сохранённые ответы всех попыток участвуют в расходе при включённом флаге. Сохраняйте файлы в защищённом месте, не открывайте неизвестное содержимое как доверенный HTML и не публикуйте токены, тела или персональные данные в скриншотах.

[Быстрый старт](/ru/docs/outbound/quickstart), [диагностика](/ru/docs/outbound/diagnostics), [хранение](/ru/docs/common/storage), [трафик](/ru/docs/common/traffic).
