提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我是 Spring 的新手,正在从事大学项目。
目标:拥有一个 REST POST 端点,它可以保存数据,但也使用 websocket 发送广播消息。
现在,我的 RestController 似乎工作正常,但真的不知道如何实现 websocket 部分?
这是端点的样子:
@PostMapping("/employees")
Employee newEmployee(@RequestBody Employee newEmployee) {
return repository.save(newEmployee);
}
我之前的想法:
- 使用具有@SendTo 注释的方法创建@Controller?
- 我可以在 RestController newEmployee 方法上使用@SendTo 吗?
最有效的方法是什么?
就像 spring 提供了@RestController 一样,它也提供了@EnableWebSocket 注解和处理双向通信的方法,下面是在 Z2A2D595E6ED9A0B24F027F2 中创建 websocket 连接的分步方法
首先进行配置 class 用于制作我们的 WebSocketConnection class bean,它将成为 websocket 连接、断开连接和来自客户端的消息的处理程序,并将其添加到 WebSocketsHandlerRegister 命名空间。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfiguration implements WebSocketConfigurer {
@Bean
public WebSocketConnection getWebSocketConnection() {
return new WebSocketConnection();
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry.addHandler(getWebSocketConnection(), "/websocket");
}
}
现在让我们制作我们的 WebSocketConnection class
public class WebSocketConnection extends TextWebSocketHandler {
private static final Logger log = LoggerFactory.getLogger(WebSocketConnection.class);
private static final Gson gson = new GsonBuilder().create();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
log.info("connected with the websocket client : " + session.getId());
}
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
JsonObject parsedMessage = gson.fromJson(message.getPayload(), JsonObject.class);
log.info("The message got from the client is " + parsedMessage);
JsonObject responseMessage = new JsonObject();
responseMessage.addProperty("response", "Your response was recorded by the server");
responseMessage.addProperty("messageReceivedtime", LocalDateTime.now().toLocalDate().toString());
int max = 100;
int min = 20;
responseMessage.addProperty("randomNo", (int) Math.floor(Math.random() * (max - min + 1) + min));
session.sendMessage(new TextMessage(responseMessage.toString())); //sending message back to the client
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
log.info("connection closed from the websocket client : " + session.getId());
}
}
你在这里完成了。
现在从 javascript 的客户端开始,您将必须像下面一样制作 websocket 客户端 object
const webSocketClient = new WebSocket('ws://localhost:port/websocket');
//const webSocketClient = new WebSocket('wss://ip:port/websocket') for cases of secure connection
有关 javascript 中 WebSocket 客户端的更多信息,请参阅此
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications
您提到了您的目标,即“拥有一个保存数据的 REST POST 端点,但也使用 websocket 发送广播消息”不应该在 1 go 中。 您可以做的是,当用户保存数据时,您可以将服务器的响应返回给已保存数据的用户,然后让该用户向websocket服务器发送消息,websocket服务器将广播给其他用户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.