【问题标题】:Providing both HTTP and WebSocket on same Route (Play Framework 2.1)在同一路由上同时提供 HTTP 和 WebSocket (Play Framework 2.1)
【发布时间】:2013-11-27 16:34:40
【问题描述】:

我试图在同一个 HTTP-Route 上同时提供 HTTP-Answer 和 WebSocket。

    GET     /                           controllers.Application.index()
    GET     /                           controllers.Application.ws()

在旧版本的 Play Framework 中,可以为“WS”定义路由,从而区分 HTTP 和 WS 请求。由于我使用的是 2.1,我需要另一种可能性来让 HTTP 和 WS 请求在同一条路由上工作。

由于 WebSocket 和 Result 不在同一个类型层次结构中,我不能将映射推迟到处理程序方法。 有没有办法根据请求的 HTTP 或 WS 重新路由请求?

提前致谢!

【问题讨论】:

    标签: http websocket request playframework-2.1 routes


    【解决方案1】:

    这可以通过编写自己的路由器来实现 - Plays 路由器无法实现上述操作,因为您说要将 / 路由到两个不同的端点,而默认的 Play 路由器不会只看请求方法和 URI 以外的任何东西。所以,如果你覆盖 Global.onRouteRequest 看起来像这样:

    override def onRouteRequest(req: RequestHeader): Option[Handler] = {
      if (req.method == "GET" && req.path == "/" &&
          req.headers.get("Upgrade").exists(_.equalsIgnoreCase("websocket))) {
        Some(controllers.Application.ws())
      } else {
        super.onRouteRequest(req)
      }
    }
    

    然后,从您的路由文件中删除 WebSocket 路由。

    如果你想为 Java 做这个,它看起来像这样:

    public Handler onRouteRequest(play.api.mvc.RequestHeader req) {
      if (req.method().equals("GET") && req.path().equals("/") &&
          req.headers().get("Upgrade").isDefined() &&
          req.headers().get("Upgrade").get().equalsIgnoreCase("websocket")) {
        return play.core.j.JavaWebSocket.ofJson(new scala.Function0<WebSocket<JsonNode>>() {
          public WebSocket<JsonNode> apply() {
            return controllers.Application.ws();
          }
        });
      } else {
        return super.onRouteRequest(req);
      }
    }
    

    不确定我的语法/类型是否 100% 正确,但希望您能解决。另外,请注意我在这里假设 JSON websockets,如果您使用字符串或字节数组,则使用JavaWebSocket.ofString/ofBytes。最后,请注意这是一个内部 API,随时可能中断。

    【讨论】:

    • 非常感谢您的回答 - 这对您有很大帮助!现在我非常接近我的(干净的)解决方案,但还有一个问题:我现在在 Java 中,并且“onRouterRequest(req)”-方法需要返回“处理程序”类型的实例。既然“Result”或者“WebSocket”都不是Handler,那么(controllers.Applications.ws())调用怎么转换成handler的实例呢?
    • 编辑了我的回复以包含 Java 解决方案。
    • 我进行了编辑以改进 Java 代码并确认它正在运行。我希望我早点知道这个黑客。
    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 2023-03-16
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多