我一直在使用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<HttpServer>并最终导致失败:

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

也失败了
无法将参数类型“Stream”分配给参数类型
'溪流'

那么如何将VirtualDirectory连接到服务器?没有可以在网上找到的示例,VirtualDirectory源代码也不清楚。如果可以的话,我会使用RTFM。链接可以作为答案。

最佳答案

VirtualDirectory可以从HttpServer.bind返回的Future内部运行。您可以使用以下五行代码来创建静态文件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);
      }
    });
  });
}

10-08 17:27