6

私はdart:route静的ファイルを提供するために API を使用してきましたがhttp_serverdart: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());

The argument type 'Stream' cannot be assigned to the parameter type 'Stream'で失敗する

では、VirtualDirectory をサーバーに接続するにはどうすればよいでしょうか? 私がオンラインで見つけることができる例はなく、VirtualDirectory のソース コードでは明確になりません。FTFM ができるなら RTFM を選びます。リンクは回答として問題ありません。

4

1 に答える 1

9

VirtualDirectory、 によって返される Future 内から動作できHttpServer.bindます。次の 5 行のコードを使用して、静的ファイル 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 に答える