(我正在使用新的lib v2版本的dart:io.)
我想为HttpServer注册多个处理程序,特别是WebSocketTransformer和其他任意处理程序.像这样的东西:
// pseudo-code
var server = HttpServer;
server.register('/foo', someHandlerFunction); // 1
server.register('/bar', someOtherHandlerFunction); // 2
server.register('/ws', webSocketHandler); // 3
Run Code Online (Sandbox Code Playgroud)
如果#1匹配,则不测试#2,依此类推.所以,这很贪心.
我看过只有一个处理程序的样本.如何注册多个处理程序?提前致谢!
新答案:使用路由包:http://pub.dartlang.org/packages/route
这是使用路线方法的示例serve():
HttpServer.bind('127.0.0.1', 8889).then((server) {
var router = new Router(server)
..serve('/ws').transform(new WebSocketTransformer()).listen(handleWebSocket)
..serve('/foo').listen((req) {
req.response..addString('foo')..close();
});
});
Run Code Online (Sandbox Code Playgroud)
路由器会自动捕获未处理的请求并发送 404,不过很快您就可以使用defaultStream可以监听的内容覆盖该请求。
路由器还支持过滤器,可用于日志记录、身份验证、压缩等:
HttpServer.bind('127.0.0.1', 8889).then((server) {
var router = new Router(server)
..filter(new RegExp(r'/.*'), (req) {
//log all requests
_logger.info("request: $req");
return new Future.immediate(true); // keep processing request
})
..filter(new Regexp(r'/secure/.*'), (req) {
// check authentication asynchronously
return getUserFromRequest(req).then((user) {
if (user == null) {
sendRedirect('/login'); // sendRedirect coming soon
return false; // stop processing request
} else {
return true; // keep processing
}
});
})
..serve(/* ... */ );
});
Run Code Online (Sandbox Code Playgroud)