在变量URL处路由SockJS连接?

时间:2017-07-19 20:02:51

标签: vert.x sockjs

假设我有一群客户都拥有自己的数字ID。他们每个人都通过SockJS连接到我的服务器,例如:

var sock = new SockJS("localhost:8080/sock/100");

在这种情况下,100是客户端的数字ID,但它可以是任意数字的任何数字。如何在服务器端代码中设置SockJS路由器,允许客户端通过URL根据用户ID的不同来设置SockJS连接?这是我现在在服务器端的简化版本:

public void start() {
    HttpServer server = vertx.createHttpServer();
    SockJSHandler sockHandler = SockJSHandler.create(vertx);
    router.route("/sock/*").handler(sockHandler);
    server.requestHandler(router::accept).listen(8080);
}

如果客户端通过localhost:8080 / sock连接,这可以正常工作,但如果我在URL的末尾添加“/ 100”,它似乎不起作用。而不是默认的“欢迎来到SockJS!”消息,我刚收到“Not Found”。我尝试设置路径正则表达式,我得到一个错误,说子路由器不能使用模式URL。那么是否有一些方法允许客户端通过变量URL连接,无论是/ sock / 100,/ sock / 15还是/ sock / 1123123?

理想情况下,我能够捕获客户端使用的数字ID(如路由REST API调用,当您可以将“/:ID”添加到路由路径,然后捕获客户端使用的值) ,但我找不到任何适合SockJS连接的东西。

由于看起来SockJS连接被认为与子路由器相同,并且子路由器不能具有模式URL,是否有一些解决方法?或者是不可能的?

修改

只是为了补充我上面所说的内容,我尝试了几种似乎还没有用的不同的东西。

我尝试设置一个初始的通用主路由器,然后重定向到SockJS处理程序。这是我的想法:

router.routeWithRegex("/sock/\\d+").handler(context -> {
    context.reroute("/final");
});

router.route("/final").handler(SockJSHandler.create(vertx));

有了这个,如果我直接通过浏览器访问localhost:8080 / sock / 100,它就会带我去“欢迎来到SockJS!”页面,Chrome网络标签显示我通过客户端测试时已创建websocket连接。

然而,我仍然得到一个错误,因为websocket显示200状态代码而不是101,我不是100%确定为什么会发生这种情况,但我猜它会与响应有关初始处理程序生成。如果我尝试将初始处理程序的状态代码设置为101,我仍然会收到错误,因为那时初始处理程序失败。

如果有办法解决这些状态代码(似乎websocket期望101但初始处理程序期望200,我认为我只能选择一个),那么这可能会解决这个问题。有什么想法吗?

0 个答案:

没有答案