Я должен реализовать собственный API над WebSockets, который требует:Строительство пользовательских API над Spring WebSockets
- Пользовательские WAMP-как подпротокол
- параметры Путь в гнездо URI
Так что я ve следующие вопросы:
- Есть ли какая-либо документация или руководства по внедрению пользовательских подпрограмм весной? Протокол требует, чтобы в поле Sec-Websocket-Protocol была указана точная версия. Где это поле можно было прочитать на стороне сервера?
Что такое правильный путь передачи параметров пути в обработчик сообщений? Я мог использовать образцы муравьев в регистрации обработчика
@Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(customHandler(), "/api/custom/{clientId}"); }
но, похоже, они отсутствуют в TextWebSocketHandler. Я решил эту проблему сейчас, расширив по умолчанию HttpSessionHandshakeInterceptor в следующим образом:
public class CustomHandshakeInterceptor extends HttpSessionHandshakeInterceptor { private static final UriTemplate URI_TEMPLATE = new UriTemplate("/api/custom/{clientId}"); @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { Map<String, String> segments = URI_TEMPLATE.match(request.getURI().getPath()); attributes.put("CLIENTID", segments.get("clientId")); return super.beforeHandshake(request, response, wsHandler, attributes); } }
, а затем к нему доступ в TextWebSocketHandler:
public class CustomHandler extends TextWebSocketHandler { @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { super.handleTextMessage(session, message); String clientId = session.getAttributes().get("CLIENTID"); ... session.sendMessage(response); } }
, но этот метод, по-моему, это немного неуклюжим. Есть ли более правильный способ решить эту проблему?
Спасибо.
Вы нашли для себя лучшее решение? – Elyran