# Тело запроса (/ru/docs/requests/body)

Вкладка **Тело** задаёт то, что запрос отправляет после заголовков. Выберите тип в строке вверху вкладки; редактор ниже
изменится соответствующим образом. Если у запроса есть тело, на вкладке видна точка.

<Shot id="requests-http-body-json" alt="Вкладка «Тело» запроса Create order с выбранным JSON, строками заказа в редакторе и кнопкой «Форматировать» справа" />

## Типы тела [#body-types]

| Тип | Что отправляется | Content-Type, который добавляет Echolot |
| --- | --- | --- |
| **Нет** | Тела нет. | Нет |
| **JSON** | Текст из редактора. | `application/json` |
| **URL-encoded** | Пары «имя — значение», как отправляет веб-форма. | `application/x-www-form-urlencoded` |
| **Multipart** | Текстовые поля и файлы, как отправляет веб-форма с загрузкой файла. | `multipart/form-data` с границей |
| **GraphQL** | Текст запроса как есть. | `application/graphql` |
| **Исходный** | Текст, XML или HTML, выбираются во второй строке чипов. | `text/plain`, `application/xml` или `text/html` |
| **Двоичный** | Файл байт в байт. | Нет |

Content-Type показан в разделе **АВТОМАТИЧЕСКИЕ** на вкладке **Заголовки**. Чтобы отправить другой, добавьте собственный
заголовок `Content-Type`; он заменит заголовок Echolot. Заголовки длины и разбиения на части вычисляются при отправке
запроса.

Любое текстовое тело может содержать `{{variables}}` и [динамические значения](/docs/requests/dynamic-values), которые
подставляются при отправке:

```json
{
  "lines": [{ "sku": "{{productId}}", "quantity": 1 }],
  "note": "Sent at {{$isoTimestamp}}"
}
```

## JSON [#json]

Введите или вставьте JSON в редактор. В нём есть номера строк, подсветка синтаксиса и список `{{` для переменных.

Нажмите **Форматировать**, чтобы расставить отступы в JSON. Переменные остаются как написаны, поэтому `{{productId}}` в
строке или как отдельное значение не затрагивается. В узкой области на кнопке остаётся только волшебная палочка.

Чтобы попробовать, откройте **Orders › Create order** в примере Alpenglow и посмотрите на его тело или отправьте
**Echo › Echo anything**, который возвращает полученное тело.

## URL-encoded [#url-encoded]

Поля находятся в таблице из **КЛЮЧ** и **ЗНАЧЕНИЕ**, как заголовки:

- Нажмите **Добавить поле**, чтобы добавить его. Отмеченные поля отправляются; неотмеченные сохраняются, но не
  отправляются.
- Нажмите **Правка текстом**, чтобы изменить все поля как текст, по одному `Name: value` в строке, а `//` перед полем
  означает, что оно выключено.

Echolot кодирует имена и значения при отправке, в том числе то, что подставляет переменная, поэтому `+`, `&` или пробел
в значении доходят как есть.

## Multipart [#multipart]

Каждая строка — одна часть формы:

1. Отметьте флажок, чтобы отправлять поле.
2. Введите **имя**.
3. Выберите **Текст** или **Файл**.
   - Для **Текст** введите **значение**. Оно может содержать `{{variables}}`.
   - Для **Файл** нажмите **Выбрать…** и выберите файл. Поле без имени берёт имя файла без расширения. Часть несёт имя
     файла как filename.
4. При желании введите **тип** содержимого части, например `image/png`. Если оставить пустым (`type (auto)`), файл получит
   его по расширению (`.json`, `.png`, `.pdf` и так далее, иначе `application/octet-stream`), а текстовое поле — никакого.

Нажмите **Добавить поле** для ещё одной строки и кнопку **−**, чтобы удалить строку. Файлы читаются с диска потоком при
отправке запроса, поэтому большая загрузка не обязана помещаться в память.

## GraphQL [#graphql]

**GraphQL** отправляет текст запроса как тело с `Content-Type: application/graphql` — для серверов, принимающих запрос
таким образом. Для полноценного клиента GraphQL с переменными, дополнением по схеме, обозревателем схемы и подписками
создайте вместо этого **Новый запрос GraphQL**. См. [GraphQL](/docs/requests/graphql).

## Исходный: текст, XML и HTML [#raw-text-xml-and-html]

Выберите **Исходный**, затем **Текст**, **XML** или **HTML** в строке рядом. Редактор подсвечивает XML и HTML, а
Content-Type следует вашему выбору.

## Двоичный: файл [#binary-a-file]

Выберите **Двоичный**, затем **Выбрать файл…** и укажите файл для отправки. Вкладка показывает его имя, размер и путь;
**Выбрать другой файл…** заменяет его. Файл читается с диска при каждой отправке запроса, каким бы большим он ни был,
поэтому запрос всегда отправляет файл в его нынешнем виде. Пока файл не выбран, ничего не отправляется.

<Edition only="appstore">
  Версия из App Store может читать только файлы, которые вы выбрали. Файл, выбранный на вкладке **Тело**, остаётся
  доступным для последующих отправок. Если запрос называет файл, которого приложению не давали (например, выбранный
  коллегой на его Mac), отправка останавливается, а область ответа предлагает **Разрешить доступ…**: выберите файл, и
  запрос отправится снова.
</Edition>

## Где сохраняются тела [#where-bodies-are-saved]

Введённое тело сохраняется в отдельном файле рядом с запросом, например `create-order.body.json` рядом с
`create-order.req.toml`, так что в Git оно читается хорошо. Двоичное тело сохраняется как путь к файлу. См.
[Файлы рабочего пространства](/docs/reference/workspace-files).

## Большие тела [#large-bodies]

Двоичные и multipart-файлы читаются с диска потоком при отправке запроса, поэтому загрузки любого размера уходят без
загрузки в память. Ответы — отдельный вопрос: они записываются на диск по мере поступления и остаются быстрыми в
просмотрщиках даже при сотнях мегабайт. См. [Ответы](/docs/requests/responses#large-responses).
