3

我的 Dart 应用程序具有以下标准结构:

/
  pubspec.yaml
  web/
    main.css
    main.dart
    main.html
  build.dart
  server.dart

当我在服务器上收到 GET 请求时,我希望服务器使用该web目录作为根目录并将文件的内容提供给客户端。

我怎样才能做到这一点?

这是我到目前为止已经走了多远:

import 'dart:io';

void main() {
    HttpServer.bind('127.0.0.1', 80).then((HttpServer server) {
      server.listen((request) { 
        print("got request");

        switch (request.method) {
          case 'GET':
            // Do I need to send the file here? ... 
            // if not fount then send HttpStatus.NOT_FOUND;
            break;

          default:

        }
      });
    });
}
4

3 回答 3

7

这是Matt B回答后我的代码的最新版本:

import 'dart:io';
import 'package:path/path.dart' as path;

String _basePath;

_sendNotFound(HttpResponse response) {
  response.write('Not found');
  response.statusCode = HttpStatus.NOT_FOUND;
  response.close();
}


_handleGet(HttpRequest request) {
  // PENDING: Do more security checks here?
  final String stringPath = request.uri.path == '/' ? '/main.html' : request.uri.path;
  final File file = new File(path.join(_basePath, stringPath));
  file.exists().then((bool found) {
    if (found) {
      file.openRead().pipe(request.response).catchError((e) { });
    } else {
      _sendNotFound(request.response);
    }
  });
}


_handlePost(HttpRequest request) {

}


void main() {
  _basePath = Platform.environment['HOME'];

  HttpServer.bind('127.0.0.1', 80).then((HttpServer server) {
    server.listen((request) { 
      switch (request.method) {
        case 'GET':
          _handleGet(request);
          break;

        case 'POST':
          _handlePost(request);
          break;

        default:
          request.response.statusCode = HttpStatus.METHOD_NOT_ALLOWED;
          request.response.close();
      }
    });
  });
}
于 2013-11-12T19:39:24.430 回答
3

Dart 网站包含一个关于编写 Web 服务器的小示例,它展示了如何提供页面。在您的情况下,因为您的server.dart文件位于根目录中(为了将来参考,通常建议将设计为运行的 CLI 脚本保存在bin每个包布局约定的目录中),您需要将“web/”附加到参数传递给脚本。

此外,请注意示例中使用的“选项”类已被弃用,您应该改用dart:io Platform.script属性。

也就是说,我强烈建议您考虑使用路由包来处理服务器请求,因为它可以轻松地根据匹配模式(包括请求方法)分配各种回调。

于 2013-11-12T17:17:08.993 回答
0

您要查找的内容已包含在 pub 中。

$ pub serve --help

Run a local web development server.

By default, this serves "web/" and "test/", but an explicit list of 
directories to serve can be provided as well.

Usage: pub serve [directories...]
-h, --help               Print this usage information.
    --mode               Mode to run transformers in.
                         (defaults to "debug")

    --all                Use all default source directories.
-D, --define             Defines an environment constant for dart2js.
    --hostname           The hostname to listen on.
                         (defaults to "localhost")

    --port               The base port to listen on.
                         (defaults to "8080")

    --[no-]dart2js       Compile Dart to JavaScript.
                         (defaults to on)

    --[no-]force-poll    Force the use of a polling filesystem watcher.

Run "pub help" to see global options.

有关详细文档,请参阅http://dartlang.org/tools/pub/cmd/pub-serve.html

于 2016-04-09T18:56:13.857 回答