繁体   English   中英

在同一路由上同时提供HTTP和WebSocket(Play Framework 2.1)

[英]Providing both HTTP and WebSocket on same Route (Play Framework 2.1)

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

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

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

由于WebSocket和Result不在同一类型层次结构中,因此我无法将映射推迟到处理程序方法。 有什么方法可以根据其HTTP或WS重新路由请求吗?

提前致谢!

如果您编写自己的路由器来做到这一点,则可以实现这一点-Plays路由器无法实现上述操作,因为您是说要路由/到两个不同的端点,默认的Play路由器只看路由器。请求方法和URI。 因此,如果您覆盖Global.onRouteRequestGlobal.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 websocket,如果您使用字符串或字节数组,请使用JavaWebSocket.ofString/ofBytes 最后,请注意,这是一个内部API,随时可能中断。

暂无
暂无

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

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