# WebSocket и SSE (/ru/docs/requests/websocket-and-sse)

Запросы WebSocket открывают соединение, которое остаётся активным: вы отправляете сообщения и видите сообщения сервера по
мере их прихода. Server-sent events (SSE) — это обычные запросы HTTP, ответ на которые продолжает поступать потоком;
Echolot показывает каждое событие по мере поступления.

## Запросы WebSocket [#websocket-requests]

<Shot id="requests-websocket-log" alt="Realtime › Order updates, подключённый к демо-API: вкладка «Сообщения» с сохранёнными сообщениями Subscribe и Ping и журнал сообщений в области ответа с отправленными и полученными событиями заказов" />

### Подключение [#connect]

1. Выберите **Файл › Новый запрос WebSocket** или **Новый запрос WebSocket** в меню **+** рядом с **Запросы** в боковой
   панели.
2. Введите адрес, начинающийся с `ws://` или `wss://`. **Realtime › Order updates** в Alpenglow использует
   `{{wsURL}}/orders`, то есть `wss://demo.echolot.dev/v1/orders`.
3. Выберите **Соединить** (<kbd>⌘</kbd><kbd>R</kbd>).

Пока соединение открыто, кнопка называется **Отключиться** (снова <kbd>⌘</kbd><kbd>R</kbd>). При активном защищённом
окружении она называется **Соединиться с Production…** (с именем этого окружения) и сначала спрашивает подтверждение.
См. [защищённые окружения](/docs/workspaces/protected-environments).

В редакторе есть вкладки: **Документация**, **Сообщения**, **Заголовки**, **Параметры**, **Авторизация**, **Переменные**,
**Тесты**, **Скрипты** и **Настройки**. Заголовки, параметры запроса и авторизация уходят с начальным рукопожатием
(обновлением HTTP), так что сервер, которому нужен токен в заголовке или адресе, получает его там. Настройки вроде
проверки TLS, прокси и сертификатов применяются так же, как для [запросов HTTP](/docs/requests/settings).

### Подпротоколы [#subprotocols]

Вверху вкладки **Сообщения** поле **Подпротоколы** перечисляет протоколы, которые нужно предложить серверу, через запятую,
например `graphql-ws, chat.v2`. Оставьте пустым, если подпротоколов нет.

### Отправка сообщений [#send-messages]

Внизу вкладки **Сообщения** введите сообщение и выберите **Отправить** (<kbd>⇧</kbd><kbd>⌘</kbd><kbd>↩</kbd>). В нём
работают `{{variables}}`. Пока соединение не открыто, в поле написано **Подключитесь, чтобы отправлять сообщения**.

Сообщения, которые вы отправляете часто, можно сохранить вместе с запросом. Выберите **+** рядом с полем, чтобы сохранить
набранное. У каждого сохранённого сообщения есть имя, текст и собственная кнопка **Отправить**. В Order updates их два:

```json
{"op":"subscribe","channel":"orders"}
```

```json
{"op":"ping"}
```

Флажок в начале сохранённого сообщения, **Отправлять в прогонах**, решает, будет ли оно отправляться, когда запрос
выполняется без вас: в [Прогоне](/docs/requests/runner), из командной строки или для агента. Они отправляют включённые
сообщения по порядку после подключения, затем слушают 10 секунд и закрываются.

### Журнал сообщений [#the-message-log]

Вкладка **Сообщения** области ответа показывает сеанс по ходу дела: каждое сообщение в обе стороны, самые новые
последними, с временем и размером, а также моменты открытия и закрытия соединения.

- **Все**, **Отправлено** и **Получено** фильтруют по направлению.
- **Фильтр сообщений** находит сообщения по тексту.
- **Ещё** показывает сообщение JSON с отступами; **Свернуть** снова сворачивает его.
- Кнопка копирования копирует сообщение.

Echolot сам отвечает на пинги сервера. Сообщение, склеенное из фрагментов, может быть размером до 64 МБ; большее
закрывает соединение с кодом 1009.

Когда соединение закрывается, сеанс сохраняется в [Истории](/docs/workspaces/history): рукопожатие как запрос, а журнал
сообщений как тело ответа.

## Server-sent events [#server-sent-events]

Поток server-sent events — это ответ HTTP типа `text/event-stream`, который продолжает присылать события. Используйте для
него обычный запрос HTTP: кроме адреса, настраивать нечего.

<Shot id="requests-sse-events" alt="Realtime › Order events, отправленный на демо-API: вкладка «События» области ответа с пронумерованными событиями, у каждого имя события, идентификатор и данные JSON" />

1. Откройте **Realtime › Order events** в рабочем пространстве Alpenglow. Он отправляет `GET {{baseURL}}/orders/events` с
   `Accept: text/event-stream`.
2. Выберите **Отправить**.
3. Выберите вкладку **События** в области ответа.

Вкладка **События** перечисляет события по порядку, с номерами, именем события и его идентификатором (`id:`), а данные —
в виде JSON, если это JSON. Она следует за новыми событиями, пока идёт поток, и считает их. Вкладка **Тело** показывает
поток так, как его записал сервер, и растёт по мере поступления.

Поток идёт, пока его не завершит сервер или вы не выберете **Отменить** (<kbd>⌘</kbd><kbd>.</kbd>); то, что пришло,
сохраняется. Когда поток начался, общий тайм-аут запроса на него больше не действует. В прогонах, из командной строки и
для агентов поток завершается через 10 секунд.

Чтобы возобновить поток с места остановки, отправьте идентификатор последнего события обратно в заголовке
`Last-Event-ID`. Поток демо-API отправляет 20 событий с интервалом в секунду, затем `end` и учитывает `Last-Event-ID`.

Подписки GraphQL по HTTP тоже используют server-sent events: см. [GraphQL](/docs/requests/graphql).

## Из командной строки [#from-the-command-line]

`echolot send` открывает сеансы WebSocket и Socket.IO и следит за потоками событий из терминала. См.
[echolot send](/docs/cli/send) и [руководство по realtime](/docs/tutorials/realtime).
