WebSocket-клиент PolyApiIDE открывает соединение по ws или wss, пишет в лог каждый кадр в обе стороны и подставляет переменные окружения прямо в адрес подключения.
WebSocket начинается как обычный HTTP-запрос с Upgrade: websocket, на который сервер отвечает 101 Switching Protocols, а дальше канал остаётся открытым и кадры идут в обе стороны. Проверять такой канал curl-ом неудобно: нужен клиент, который держит соединение и показывает историю сообщений.
Типовые задачи — проверить, что сервер поднимает соединение на нужном адресе, что токен принимается, что после подключения приходит ожидаемый первый кадр, и что сервер корректно реагирует на ваше сообщение. Всё это видно только в живом канале: лог кадров с временем и направлением отвечает на вопрос «кто первый перестал отвечать» быстрее, чем логи приложения.
В PolyApiIDE WebSocket — это отдельный тип пространства, который лежит в том же проекте, что REST- и GraphQL-запросы. Адрес подключения, токены и имена каналов удобно держать в окружениях, а само соединение переключать между dev, test и продом одним выбором окружения.
Тип протокола задаётся на пространстве или на отдельном запросе. В адрес впишите схему ws:// для локальной разработки или wss:// для всего остального — браузер не даст открыть незащищённое соединение со страницы по HTTPS.
Хост, идентификатор канала и токен вынесите в окружение: wss://{{host}}/ws?token={{token}}. Подстановка {{var}} и {var} работает в URL так же, как в REST-запросах, так что один и тот же запрос годится для всех контуров.
Успешное рукопожатие — это ответ 101 Switching Protocols. Если вместо него пришёл 401, 403 или 404, проблема ещё на уровне HTTP: адрес, авторизация или маршрут на прокси.
Сообщения уходят текстом — например, JSON-команда подписки, — и попадают в общий лог вместе с тем, что присылает сервер. По логу видно порядок кадров, задержки и момент закрытия канала.
Когда соединение закрылось, смотрите код: он отличает нормальное завершение от обрыва и от отказа сервера. Расшифровка частых кодов — в таблице ниже.
| Код | Что означает | Куда смотреть |
|---|---|---|
| 1000 | Нормальное закрытие, обе стороны договорились | Всё в порядке, обрыва не было |
| 1001 | Сторона уходит — вкладка закрыта или сервер перезапускается | Деплой, рестарт, выключение воркера |
| 1006 | Аварийное закрытие без close-кадра | Прокси, таймаут простоя, разрыв сети |
| 1008 | Сообщение нарушило политику сервера | Авторизация, формат кадра, лимиты |
| 1009 | Кадр слишком большой | Ограничение размера сообщения на сервере |
| 1011 | Внутренняя ошибка на сервере | Логи приложения, исключение в обработчике |
| 4000-4999 | Коды приложения | Документация вашего сервиса |
Код 1006 чаще всего означает, что соединение разорвал посредник, а не ваш код: почти всегда виноват таймаут простоя на nginx или балансировщике.
Клиент работает внутри браузера и использует его WebSocket API, а у него есть особенности. Произвольные заголовки при рукопожатии задать нельзя — это ограничение самого браузерного API, а не расширения. Поэтому токен передают query-параметром, cookie или через подпротокол, а не заголовком Authorization. Если ваш сервер принимает только заголовок, проверку придётся делать серверным инструментом.
Также недоступны произвольные TCP-соединения и бинарные протоколы поверх них: браузер умеет только WebSocket и HTTP. Нагрузочные профили в расширении рассчитаны на HTTP-запросы, а не на удержание тысяч одновременных сокетов.
Нет. Free работает сразу после установки расширения, аккаунт на сайте для отправки запросов и подключения к WebSocket не нужен.
Нет — браузерный WebSocket API не позволяет задавать заголовки при рукопожатии. Рабочие варианты: query-параметр, cookie или подпротокол. Это ограничение платформы, оно одинаково для любого клиента, работающего в браузере.
Как правило, это таймаут простоя у обратного прокси. Проверьте настройки на nginx или балансировщике и отправляйте пинг-кадры со стороны приложения. В логе такой разрыв видно как код 1006 без close-кадра.
Для локальной разработки — да, для всего остального браузер потребует wss://. Смешивать защищённую страницу и незащищённое соединение он не позволит.
Сами запросы и адреса — да, они лежат в коллекциях локально в браузере. Открытое соединение, естественно, живёт только пока расширение запущено.