我一直在使用dart:route
api来提供静态文件,但我注意到有一个核心库http_server
,它包含了帮助程序类和函数dart:io
HttpServer
.
我特别感兴趣的是这个类VirtualDirectory
,根据文档,它为目录的静态内容获取一个String对象,然后调用该方法serve()
var virtualDirectory = new VirtualDirectory('/var/www/');
virtualDirectory.serve(new HttpServer('0.0.0.0', 8080));
这不起作用,因为没有HttpServer的构造函数 - 至少在当前版本中没有.
virtualDirectory.serve(HttpServer.bind('0.0.0.0', 8080));
这是我实例化服务器的方式也失败了,因为virtualDirectory.serve()
没有采取Future
最后:
virtualDirectory.serve(HttpServer.bind('0.0.0.0', 8080).asStream());
也失败了 参数类型'Stream'无法分配给参数类型'Stream'
那么如何将VirtualDirectory连接到服务器?我没有在线可以找到的示例,VirtualDirectory源代码也没有说清楚.如果我能用FTFM,我会RTFM.链接很好,作为答案.
将VirtualDirectory
可以从内部未来返回的工作HttpServer.bind
.您可以使用以下五行代码创建静态文件Web服务器:
HttpServer.bind('127.0.0.1', 8888).then((HttpServer server) {
VirtualDirectory vd = new VirtualDirectory('../web/');
vd.jailRoot = false;
vd.serve(server);
});
您可以通过解析URI并在提供文件之前提取服务请求来使其更加复杂.
import 'dart:io';
import 'package:http_server/http_server.dart';
main() {
handleService(HttpRequest request) {
print('New service request');
request.response.write('[{"field":"value"}]');
request.response.close();
};
HttpServer.bind('127.0.0.1', 8888).then((HttpServer server) {
VirtualDirectory vd = new VirtualDirectory('../web/');
vd.jailRoot = false;
server.listen((request) {
print("request.uri.path: " + request.uri.path);
if (request.uri.path == '/services') {
handleService(request);
} else {
print('File request');
vd.serveRequest(request);
}
});
});
}