6

我一直在使用dart:routeapi 来提供静态文件,但我注意到有一个名为的核心库http_server,其中包含dart:io HttpServer.

我特别感兴趣的是VirtualDirectory,根据文档,该类将一个字符串对象用于目录的静态内容,然后调用该方法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<HttpServer>最后:

virtualDirectory.serve(HttpServer.bind('0.0.0.0', 8080).asStream());

也失败了 参数类型“流”不能分配给参数类型“流”

那么如何将 VirtualDirectory 连接到服务器呢?我在网上找不到任何示例,VirtualDirectory 源代码也没有说清楚。如果我可以 FTFM,我会选择 RTFM。链接作为答案很好。

4

1 回答 1

9

VirtualDirectory可以从返回的 Future 内部工作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);
      } 
    });
  });
}
于 2013-12-02T03:48:52.280 回答