WebSocket-клиент в браузере

WebSocket-клиент PolyApiIDE открывает соединение по ws или wss, пишет в лог каждый кадр в обе стороны и подставляет переменные окружения прямо в адрес подключения.

WebSocket начинается как обычный HTTP-запрос с Upgrade: websocket, на который сервер отвечает 101 Switching Protocols, а дальше канал остаётся открытым и кадры идут в обе стороны. Проверять такой канал curl-ом неудобно: нужен клиент, который держит соединение и показывает историю сообщений.

Когда нужен отдельный WebSocket-клиент

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

В PolyApiIDE WebSocket — это отдельный тип пространства, который лежит в том же проекте, что REST- и GraphQL-запросы. Адрес подключения, токены и имена каналов удобно держать в окружениях, а само соединение переключать между dev, test и продом одним выбором окружения.

Как проверить WebSocket-соединение

1. Создайте WebSocket-пространство

Тип протокола задаётся на пространстве или на отдельном запросе. В адрес впишите схему ws:// для локальной разработки или wss:// для всего остального — браузер не даст открыть незащищённое соединение со страницы по HTTPS.

2. Подставьте переменные в адрес

Хост, идентификатор канала и токен вынесите в окружение: wss://{{host}}/ws?token={{token}}. Подстановка {{var}} и {var} работает в URL так же, как в REST-запросах, так что один и тот же запрос годится для всех контуров.

3. Откройте соединение

Успешное рукопожатие — это ответ 101 Switching Protocols. Если вместо него пришёл 401, 403 или 404, проблема ещё на уровне HTTP: адрес, авторизация или маршрут на прокси.

4. Отправляйте кадры и читайте лог

Сообщения уходят текстом — например, JSON-команда подписки, — и попадают в общий лог вместе с тем, что присылает сервер. По логу видно порядок кадров, задержки и момент закрытия канала.

5. Разберите код закрытия

Когда соединение закрылось, смотрите код: он отличает нормальное завершение от обрыва и от отказа сервера. Расшифровка частых кодов — в таблице ниже.

Частые коды закрытия WebSocket

КодЧто означаетКуда смотреть
1000 Нормальное закрытие, обе стороны договорились Всё в порядке, обрыва не было
1001 Сторона уходит — вкладка закрыта или сервер перезапускается Деплой, рестарт, выключение воркера
1006 Аварийное закрытие без close-кадра Прокси, таймаут простоя, разрыв сети
1008 Сообщение нарушило политику сервера Авторизация, формат кадра, лимиты
1009 Кадр слишком большой Ограничение размера сообщения на сервере
1011 Внутренняя ошибка на сервере Логи приложения, исключение в обработчике
4000-4999 Коды приложения Документация вашего сервиса

Код 1006 чаще всего означает, что соединение разорвал посредник, а не ваш код: почти всегда виноват таймаут простоя на nginx или балансировщике.

Что умеет WebSocket-пространство

  • Подключение по ws и wss с подстановкой переменных в URL
  • Отправка текстовых кадров и общий лог сообщений в обе стороны
  • Окружения и иерархия переменных: запрос → коллекция → пространство → окружение
  • Коллекции и папки — подключения сохраняются рядом с остальными запросами проекта
  • Pre-request и after-response скрипты
  • SSE в этом же проекте, если сервер отдаёт поток событий по HTTP
  • Данные хранятся локально в браузере, облако — только по вашей команде

Ограничения, о которых стоит знать заранее

Клиент работает внутри браузера и использует его WebSocket API, а у него есть особенности. Произвольные заголовки при рукопожатии задать нельзя — это ограничение самого браузерного API, а не расширения. Поэтому токен передают query-параметром, cookie или через подпротокол, а не заголовком Authorization. Если ваш сервер принимает только заголовок, проверку придётся делать серверным инструментом.

Также недоступны произвольные TCP-соединения и бинарные протоколы поверх них: браузер умеет только WebSocket и HTTP. Нагрузочные профили в расширении рассчитаны на HTTP-запросы, а не на удержание тысяч одновременных сокетов.

Частые вопросы

Нужна ли регистрация?

Нет. Free работает сразу после установки расширения, аккаунт на сайте для отправки запросов и подключения к WebSocket не нужен.

Можно ли передать токен в заголовке?

Нет — браузерный WebSocket API не позволяет задавать заголовки при рукопожатии. Рабочие варианты: query-параметр, cookie или подпротокол. Это ограничение платформы, оно одинаково для любого клиента, работающего в браузере.

Почему соединение рвётся через минуту-две?

Как правило, это таймаут простоя у обратного прокси. Проверьте настройки на nginx или балансировщике и отправляйте пинг-кадры со стороны приложения. В логе такой разрыв видно как код 1006 без close-кадра.

Можно ли открыть ws:// с продакшн-адреса?

Для локальной разработки — да, для всего остального браузер потребует wss://. Смешивать защищённую страницу и незащищённое соединение он не позволит.

Сохраняются ли подключения между сессиями?

Сами запросы и адреса — да, они лежат в коллекциях локально в браузере. Открытое соединение, естественно, живёт только пока расширение запущено.