netty-websocket-spring-boot-starter icon indicating copy to clipboard operation
netty-websocket-spring-boot-starter copied to clipboard

@OnMessage不支持@PathVariable String类型数据接收

Open yyrely opened this issue 2 years ago • 14 comments

@OnMessage方法的String参数都会被赋值成发送的信息,@PathVariable会失效

yyrely avatar Oct 15 '21 02:10 yyrely

OnMessage是用来接收websocket消息的,websocket消息不是http请求,不会有url上的参数

YeautyYE avatar Oct 15 '21 02:10 YeautyYE

websocket消息是建立连接之后的信息传输,连接地址的信息也是可以获取到的。 我看了你的实现,OnMessage且String参数的会直接赋值为发送信息,其他类型的还是会走@PathVariable的参数获取

yyrely avatar Oct 15 '21 03:10 yyrely

@OnMessage public void onMessage(String message,@PathParam("key") String key ) { Spring的WebScoekt可以获取链接地址里的参数,如果可以获取,会减少业务编码的复杂度

XuePeng87 avatar Nov 30 '21 02:11 XuePeng87

@OnMessage public void onMessage(String message,@PathParam("key") String key ) { Spring的WebScoekt可以获取链接地址里的参数,如果可以获取,会减少业务编码的复杂度

没有太大必要性,毕竟这个是OnOpen的时候就确定的。 如果需要,自己找个地方放一下就行,框架强制存一份相对比较重,不合适

YeautyYE avatar Nov 30 '21 07:11 YeautyYE

倒不是要框架去存一份,你写的是满足链接地址上取值的,但是这必须是其他类型不能是String。 String类型不支持因为你的实现如此,onMessage方法中的所有String字段都会赋值上msg。

yyrely avatar Nov 30 '21 07:11 yyrely

倒不是要框架去存一份,你写的是满足链接地址上取值的,但是这必须是其他类型不能是String。 String类型不支持因为你的实现如此,onMessage方法中的所有String字段都会赋值上msg。

连接只有在客户端发起http请求的时候才有,后面发消息的时候不存在连接,只有msg。 不存的话,不可能拿得到

YeautyYE avatar Nov 30 '21 07:11 YeautyYE

在握手完毕建立连接后,http相关请求行,请求头都应该抛弃掉,成为一个纯粹的websocket通道

YeautyYE avatar Nov 30 '21 07:11 YeautyYE

要是纯粹是这样也没有问题,open的时候可以把信息存在session中,发送信息的时候在session中获取。 但是现在是支持其他类型,单单不支持String,所以我提了这个问题。

yyrely avatar Nov 30 '21 08:11 yyrely

要是纯粹是这样也没有问题,open的时候可以把信息存在session中,发送信息的时候在session中获取。 但是现在是支持其他类型,单单不支持String,所以我提了这个问题。

onMessage是被框架回调的,支持其他类型你如何使用呢

YeautyYE avatar Nov 30 '21 08:11 YeautyYE

可能纯粹是这样也没有问题,打开的时候可以把信息存在会话中,发送信息的时候在会话中获取。但是现在是支持其他类型,单单不支持字符串,所以我提了这个问题。

onMessage 是被框架画面的,支持其他类型的你如何使用呢

onMessage(Session session, String message, @PathVariable Integer xxx,@PathVariable Integer xx) 这样是可以获取到路径上xxx和xx参数的ws://test/{xxx}/{xx}

yyrely avatar Nov 30 '21 08:11 yyrely

image 这样应该能满足你的需求

fzdwx avatar May 23 '22 09:05 fzdwx

放到链接后面拼装的参数里: "?a=b&c=d", 就可以通过这个对象拿到 @RequestParam MultiValueMap reqMap

luoziyihao avatar Jun 22 '22 08:06 luoziyihao

放到链接后面拼装的参数里: "?a=b&c=d", 就可以通过这个对象拿到 @RequestParam MultiValueMap reqMap

我试试

XuePeng87 avatar Jun 22 '22 11:06 XuePeng87

我也遇到这个问题了 onClose onEvent 啥的填上 @RequestParam String uid 都是ws链接过来的key 只有onMessage上面@RequestParam String uid是客户端发来的消息 这个设计感觉不合理 很容易误解 这个问题我通过私有变量存一份也可以解决

xujimu avatar Nov 13 '22 10:11 xujimu