WebSocketRoute
Когда маршрут WebSocket
настроен с помощью Page.routeWebSocket() или BrowserContext.routeWebSocket(), объект WebSocketRoute
позволяет обрабатывать WebSocket, как это делает реальный сервер.
Мокирование
По умолчанию маршрутизированный WebSocket не подключается к серверу. Таким образом, вы можете имитировать всю коммуникацию через WebSocket. Вот пример, который отвечает на "request"
с "response"
.
page.routeWebSocket("wss://example.com/ws", ws -> {
ws.onMessage(frame -> {
if ("request".equals(frame.text()))
ws.send("response");
});
});
Поскольку мы не вызываем WebSocketRoute.connectToServer() внутри обработчика маршрута WebSocket, Playwright предполагает, что WebSocket будет имитирован, и автоматически открывает WebSocket внутри страницы.
Вот еще один пример, который обрабатывает JSON-сообщения:
page.routeWebSocket("wss://example.com/ws", ws -> {
ws.onMessage(frame -> {
JsonObject json = new JsonParser().parse(frame.text()).getAsJsonObject();
if ("question".equals(json.get("request").getAsString())) {
Map<String, String> result = new HashMap();
result.put("response", "answer");
ws.send(gson.toJson(result));
}
});
});
Перехват
В качестве альтернативы, вы можете подключиться к реальному серверу, но перехватывать сообщения между ними и изменять или блокировать их. Вызов WebSocketRoute.connectToServer() возвращает серверный экземпляр WebSocketRoute
, к которому вы можете отправлять сообщения или обрабатывать входящие сообщения.
Ниже приведен пример, который изменяет некоторые сообщения, отправляемые страницей на сервер. Сообщения, отправляемые с сервера на страницу, остаются нетронутыми, полагаясь на стандартную пересылку.
page.routeWebSocket("/ws", ws -> {
WebSocketRoute server = ws.connectToServer();
ws.onMessage(frame -> {
if ("request".equals(frame.text()))
server.send("request2");
else
server.send(frame.text());
});
});
После подключения к серверу все сообщения пересылаются между страницей и сервером по умолчанию.
Однако, если вы вызываете WebSocketRoute.onMessage() на оригинальном маршруте, сообщения от страницы к серверу больше не будут пересылаться, но должны обрабатываться обработчиком.
Аналогично, вызов WebSocketRoute.onMessage() на серверном WebSocket прекратит пересылку сообщений с сервера на страницу, и обработчик должен позаботиться о них.
Следующий пример блокирует некоторые сообщения в обоих направлениях. Поскольку он вызывает WebSocketRoute.onMessage() в обоих направлениях, автоматической пересылки вообще нет.
page.routeWebSocket("/ws", ws -> {
WebSocketRoute server = ws.connectToServer();
ws.onMessage(frame -> {
if (!"blocked-from-the-page".equals(frame.text()))
server.send(frame.text());
});
server.onMessage(frame -> {
if (!"blocked-from-the-server".equals(frame.text()))
ws.send(frame.text());
});
});
Методы
close
Added in: v1.48Закрывает одну сторону WebSocket соединения.
Использование
WebSocketRoute.close();
WebSocketRoute.close(options);
Аргументы
options
WebSocketRoute.CloseOptions
(опционально)-
Опциональный код закрытия.
-
setReason
String (опционально)#Опциональная причина закрытия.
-
Возвращает
connectToServer
Added in: v1.48По умолчанию маршрутизированный WebSocket не подключается к серверу, поэтому вы можете имитировать всю коммуникацию через WebSocket. Этот метод подключается к реальному WebSocket серверу и возвращает серверный экземпляр WebSocketRoute, предоставляя возможность отправлять и получать сообщения с сервера.
После подключения к серверу:
- Сообщения, полученные с сервера, будут автоматически пересылаться в WebSocket на странице, если только WebSocketRoute.onMessage() не вызван на серверной стороне
WebSocketRoute
. - Сообщения, отправленные вызовом
WebSocket.send()
на странице, будут автоматически пересылаться на сервер, если только WebSocketRoute.onMessage() не вызван на оригинальномWebSocketRoute
.
Смотрите примеры в начале для более подробной информации.
Использование
WebSocketRoute.connectToServer();
Возвращает
onClose
Added in: v1.48Позволяет обрабатывать WebSocket.close
.
По умолчанию закрытие одной стороны соединения, либо на странице, либо на сервере, закроет другую сторону. Однако, когда обработчик WebSocketRoute.onClose() настроен, стандартная пересылка закрытия отключается, и обработчик должен позаботиться об этом.
Использование
WebSocketRoute.onClose(handler);
Аргументы
-
Функция, которая будет обрабатывать закрытие WebSocket. Получает опциональный код закрытия и опциональную причину закрытия.
onMessage
Added in: v1.48Этот метод позволяет обрабатывать сообщения, которые отправляются через WebSocket, либо со страницы, либо с сервера.
Когда вызывается на оригинальном маршруте WebSocket, этот метод обрабатывает сообщения, отправленные со страницы. Вы можете обрабатывать эти сообщения, отвечая на них с помощью WebSocketRoute.send(), пересылая их на серверное соединение, возвращенное WebSocketRoute.connectToServer(), или делая что-то еще.
После вызова этого метода сообщения не пересылаются автоматически на сервер или на страницу - вы должны сделать это вручную, вызывая WebSocketRoute.send(). Смотрите примеры в начале для более подробной информации.
Повторный вызов этого метода заменит обработчик на новый.
Использование
WebSocketRoute.onMessage(handler);
Аргументы
-
handler
Consumer<WebSocketFrame>#Функция, которая будет обрабатывать сообщения.
send
Added in: v1.48Отправляет сообщение в WebSocket. Когда вызывается на оригинальном WebSocket, отправляет сообщение на страницу. Когда вызывается на результате WebSocketRoute.connectToServer(), отправляет сообщение на сервер. Смотрите примеры в начале для более подробной информации.
Использование
WebSocketRoute.send(message);
Аргументы
url
Added in: v1.48URL WebSocket, созданного на странице.
Использование
WebSocketRoute.url();
Возвращает