SpringBoot 写好后端的 WebSocket 代码之后前端应该怎么调用呢?(不在同一个项目)

后端使用 SpringBoot 集成的 WebSocket 服务

Java 代码如下:

配置 WebSocket

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        stompEndpointRegistry.addEndpoint("/endpointSang").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
    }
}

WebSocket 控制器

@Controller
public class WsController {
    @MessageMapping("/welcome")
    @SendTo("/topic/getResponse")
    public ResponseMessage say(RequestMessage message) {
        System.out.println(message.getName());
        return new ResponseMessage("welcome," + message.getName() + " !");
    }
}

现在前端进行连接时会抛出异常

var ctx = 'ws://localhost:8080'
// 创建一个 Scoket 端点连接
var socket = new SockJS(`${ctx}/endpointSang`)
var stompClient = Stomp.over(socket)
// 链接到端点
stompClient.connect({}, frame => {
  console.log('连接到:', frame)
  stompClient.subscribe(`${ctx}/topic/getResponse`, response => {
    console.log('订阅的主题发送了消息:', JSON.parse(response.body).responseMessage)
  })
})
// 通过端点客户端发送一个消息到服务器
stompClient.send(`${ctx}/welcome`, {}, JSON.stringify({ name: 'rx' }))

// 抛出的异常
main.js:73 Uncaught SyntaxError: The URL's scheme must be either 'http:' or 'https:'. 'ws:' is not allowed.
    at new SockJS (main.js:73)
    at simple-websocket.html:17

但如果是在后端项目下的话就可以使用下面的代码进行调用

// 这里是空的,不需要指定前缀
var ctx = ''
// 创建一个 Scoket 端点连接
var socket = new SockJS(`${ctx}/endpointSang`)
var stompClient = Stomp.over(socket)
// 链接到端点
stompClient.connect({}, frame => {
  console.log('连接到:', frame)
  stompClient.subscribe(`${ctx}/topic/getResponse`, response => {
    console.log('订阅的主题发送了消息:', JSON.parse(response.body).responseMessage)
  })
})
// 通过端点客户端发送一个消息到服务器
stompClient.send(`${ctx}/welcome`, {}, JSON.stringify({ name: 'rx' }))

所以,发生了什么?吾辈应该怎么做呢?

阅读 7.3k
3 个回答

最近写过类似的,自定义配置拦截器和广播消息前缀

clipboard.png

然后业务层使用消息模板,其他照常

@Autowired
private SimpMessagingTemplate messagingTemplate;


messagingTemplate.convertAndSend("/topic/notice", string);

异常里已经说明了,应该用http的地址去链接,既然是sockjs,就不能用ws和wss地址了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题