[英]Streaming an http response within a composed action in 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.onRouteRequest
以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 websocket,如果您使用字符串或字节数组,请使用JavaWebSocket.ofString/ofBytes
。 最后,请注意,这是一个内部API,随时可能中断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.