如何在Dart中为HttpServer注册多个处理程序?

Set*_*add 6 dart

(我正在使用新的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,依此类推.所以,这很贪心.

我看过只有一个处理程序的样本.如何注册多个处理程序?提前致谢!

Jus*_*ani 3

新答案:使用路由包: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)