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

如何在Dart中为HttpServer注册多个处理程序?,dart,Dart,(我正在使用dart:io的新lib v2版本。) 我想为HttpServer注册多个处理程序,特别是WebSocketTransformer和其他任意处理程序。大概是这样的: //伪代码 var-server=HttpServer; server.register('/foo',someHandlerFunction);//1. server.register('/bar',someOtherHandlerFunction);//2. server.register('/ws',webSock

(我正在使用dart:io的新lib v2版本。)

我想为HttpServer注册多个处理程序,特别是WebSocketTransformer和其他任意处理程序。大概是这样的:

//伪代码
var-server=HttpServer;
server.register('/foo',someHandlerFunction);//1.
server.register('/bar',someOtherHandlerFunction);//2.
server.register('/ws',webSocketHandler);//3.
如果#1匹配,则不测试#2,依此类推。所以,它是贪婪的

我见过只有一个处理器的样本。如何注册多个处理程序?提前谢谢

以下是建议注册WebSocket处理程序的方法:

服务器
.where((请求)=>request.uri.path==“/ws”)
.transform(新的WebSocketTransformer()).listen((webSocket)=>…);
但是,服务器是单个订阅流。一旦附加了
侦听器
,就不能附加其他侦听器

我真正想要的是让一些东西查看一个事件,决定它是否可以处理它,如果可以,然后将它路由到另一个流。否则,把它传下去。这样,事件(在本例中是一个HttpRequest对象)沿着一个链传递,直到被处理为止

我构建了一个
TakeAndRoute
类,该类扩展了
streamventttransformer
TakeAndRoute
使用一个函数来确定是否应该捕获事件并将其路由到另一个流,或者简单地将其转发

以下是我的想法:

导入'dart:io';
导入“dart:async”;
手网袋(网袋网袋){
webSocket.listen((事件){
if(事件为MessageEvent){
/*处理消息*/
}else if(事件为CloseEvent){
/*把手关上*/
}
});
}
类型定义布尔值应为(e);
类型def void RouteTo(流);
类型DEF无效手柄通风口(e);
TakeAndRoute类电压互感器{
应该拿应该拿;
RouteTo RouteTo;
StreamController=新的StreamController();
手排气处理器;
TakeAndRoute(this.shouldTake,{this.routeTo,this.handler}){
如果(routeTo!=null)routeTo(controller.stream);
}
handleData(事件、StreamSink){
打印(“处理”);
如果(应该采取(事件)){
if(routeTo!=null){
添加(事件);
}
if(处理程序!=null){
处理者(事件);
}
}否则{
sink.add(事件);
}
}
}
main(){
HttpServer.bind('127.0.0.1',8888)
.然后((HttpServer服务器){
服务器
.transform(新TakeAndRoute)(
(req)=>req.uri.path='/ws',
routeTo:(stream)=>stream.transform(新的WebSocketTransformer()).listen(handleWebSocket)))
.transform(新TakeAndRoute)(
(req)=>req.uri.path='/foo',
处理程序:(req){
打印('gotfoo');
请求响应addString(“foo”);
req.response.close();
}))
.listen((请求){
打印(${req.uri}获得404);
req.response.statusCode=404;
req.response.close();
});
});
}

诚然,这可能有些过分。

这里有一个更简单但更简单的方法:

HttpServer.bind('127.0.0.1',8889)
.然后((HttpServer服务器){
var sc=新的StreamController();
sc.stream.transform(新WebSocketTransformer()).listen(handleWebSocket);
侦听((HttpRequest请求){
打印(“来自${request.uri.scheme}${request.uri}的新连接”);
//看https://code.google.com/p/dart/issues/detail?id=8825
//if(request.uri.scheme==“ws”){
if(request.uri.path='/ws'){
sc.add(请求);
}else if(request.uri.path='/foo'){
request.response.addString('foo');
request.response.close();
}否则{
打印(${request.uri}获得404);
request.response.statusCode=404;
request.response.close();
}
});
});

请注意,我必须创建一个StreamController,以便将事件泵送到
WebSocketTransformer

新答案:使用路由包:

下面是使用route的
service()
方法的示例:

HttpServer.bind('127.0.0.1',8889)。然后((服务器){
var路由器=新路由器(服务器)
…服务('/ws')。转换(新WebSocketTransformer())。侦听(handleWebSocket)
…上菜('/foo')。听((请求){
请求响应..addString('foo')…close();
});
});
路由器会自动捕获未处理的请求并发送404,不过很快您就可以使用
defaultStream
来覆盖404

路由器还支持过滤器,可用于日志记录、身份验证、压缩等:

HttpServer.bind('127.0.0.1',8889)。然后((服务器){
var路由器=新路由器(服务器)
..过滤器(新的RegExp(r'/.''),(req){
//记录所有请求
_logger.info(“请求:$req”);
返回新的未来。立即(true);//继续处理请求
})
…过滤器(新的Regexp(r'/secure/*'),(req){
//异步检查身份验证
返回getUserFromRequest(req)。然后((用户){
if(user==null){
sendRedirect('/login');//sendRedirect即将推出
返回false;//停止处理请求
}否则{
返回true;//继续处理
}
});
})
…发球(/*…*/);
});