我尝试将Websocket与spring boot后端(作为API)和Vuejs前端一起使用。
我以一个简单的用例来揭露我的问题。一些用户已登录我的网站,并且具有消息传递功能。用户A向用户B发送一条消息。用户B实际上已登录,我想通知用户B新消息已到达。
我发现使用websockets的3种方法:
1-当用户A发送消息时,会向API调用Axios帖子以保存消息,如果Axios响应成功,我会调用
this.stompClient.send("/app/foo", JSON.stringify(bar), {})
2-当用户A发送邮件时,我仅拨打
之类的电话this.stompClient.send("/app/foo", JSON.stringify(bar), {})
这是我的控制器的方法(用@MessageMapping(“ / xxxx”注释)@SendTo(“ / topic / yyyy”)注释),它首先调用Facade,Service,Dao,然后保存消息,然后将消息返回给订阅者>
3-我保留我的实际控制器,外观,服务和DAO,并在保存成功后添加:
@Autowired SimpMessagingTemplate webSocket;
...
@GetMapping("/send-message")
public ResponseEntity sendMessage(@AuthenticationPrincipal User user, ....) {
service.saveMessage(....);
webSocket.convertAndSend("/ws/message-from", message);
没有新的控制器,则包含@MessageMapping(“ / xxxx”)@SendTo(“ / topic / yyyy”)。用户B刚刚加入了“ / ws / message-from”
你能帮我吗?
在3种方式中有一种好的方法吗?
谢谢。
答案 0 :(得分:0)
一种方法和第二种方法没有什么区别,因为您使用npm中的axios发送请求,而另一种方法可以直接使用,而第三种方法则使用控制器和Facade dao在单个位置。它涉及体系结构以及如何使用您希望根据要求发送对框架的请求。
在您有特定要求之前,它们在各自的水平上均能发挥最佳作用。
建议使用axios。 它具有以下优点:
supports older browsers (Fetch needs a polyfill)
has a way to abort a request
has a way to set a response timeout
has built-in CSRF protection
supports upload progress
performs automatic JSON data transformation
works in Node.js