繁体   English   中英

如何结合 Spring REST 和 WebSocket?

How to combine Spring REST and WebSocket?

提示:本站收集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 吗?

最有效的方法是什么?

1 个回复

就像spring提供@RestController一样,它也提供了@EnableWebSocket注解和处理双向通信的方法,下面是spring中创建websocket连接的分步方法
首先创建一个配置类,用于创建我们的 WebSocketConnection 类 bean,它将作为 websocket 连接、断开连接和来自客户端的消息的处理程序,并将其添加到 WebSocketHandlerRegister 及其命名空间。

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 类

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 客户端对象

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 次。 您可以做的是,当用户保存数据时,您可以将服务器的响应返回给已保存数据的用户,然后让该用户向 websocket 服务器发送消息,websocket 服务器将向其他用户广播。

3 将Spring REST服务与Wicket结合

因此,我正在同时使用Spring和Wicket的应用程序中开发REST API。 如果我在Spring @Controller带注释的类(充当Web服务器的类)上对@RequestMapping(value =“ / exchange”)进行注释,我该如何配置Wicket以“识别” htt ...

5 使用 Spring Boot 的带有 websocket 的 REST API

我实际上正在为我的大学初级项目工作。 我想用 spring boot 做一个游戏,这个游戏需要一个WebSocket 。 我肯定需要为用户注册、删除、更新、发布和获取数据制作一个REST API 。 我可以将 WebSocket 与 REST 一起使用吗? 如果是,请向我发送可以帮助我的资源,否则 ...

10 spring websocket,如何实现@sendtouser

我想与正在观看同一视频的人进行聊天。 但我不知道在春季@sentTouser的实现。 我想创建一个类似的Java注释@sentToVideo,以便我可以在控制器中添加一个方法并添加此新注释,然后该方法的返回值可以通过websocket发送到视频聊天。 那怎么开始呢? 春天我应该学什么? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM