【问题标题】:Rewrite request URI in dart在 dart 中重写请求 URI
【发布时间】:2014-07-03 18:50:58
【问题描述】:

在 node.js 中,可以通过执行以下操作来调整请求的 url:

app.use(function(req, res, next) {
  if (req.url.slice(-1) === '/') {
    req.url = req.url.slice(0, -1);
  }
  next();
});

以下在 dart 中失败,因为所有请求属性,Uri 及其路径只有 getter。有什么建议可以实现吗?也许通过创建一个新的 HttpRequest 并将其响应传递给原始请求?

void main() {
  var virDir = new VirtualDirectory("../somewhere_else");

  HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 8080).then((server) {
    print("Serving at ${server.address}:${server.port}");
    server.listen((HttpRequest request) {
      request.uri.path = "/newPath";
      virDir.serverRequest(request);
    });
  });
}

【问题讨论】:

  • 为什么需要更改路径/重定向请求?
  • @Robert 在我们的项目设置中,我们有一个 dart 服务器和一个 dart 客户端。两者都是应用程序包并遵循 pub 布局约定。 server/bin 中的服务器 dart 文件和 client/web.xml 中的客户端内容。服务器可以通过指向 client/web/build 目录的 VirtualDirectory 为客户端提供服务(或重定向到开发环境中的 pub serve)。为了区别对服务器的其他请求,URL 必须以 /client/ 开头。但这也意味着,一切都必须在 client/web/client/* 中,除非 /client/ 部分可以从原始请求 uri 路径中删除。
  • 你能扩展 HttpRequest 并覆盖你需要的 getter 吗?
  • @Robert 不,我不这么认为,因为服务器已经创建了 HttpRequest。

标签: dart dart-io


【解决方案1】:

从 http_server (VirtualDirectory) 的 0.9.3 版开始,我在构造函数中添加了一个可选的 pathPrefix 命名参数。

http://www.dartdocs.org/documentation/http_server/0.9.3/index.html#http_server/http_server.VirtualDirectory#id_VirtualDirectory-

这应该可以完全按照您的要求做,而无需重写请求的 Uri。

【讨论】:

    【解决方案2】:

    您是否尝试过使用serveFile 而不是serveRequest?这可能是一个临时解决方法,直到您想要的行为被实施或由 Dart 团队开发人员解决。

    我没有测试过这段代码,但理论上它应该可以工作:

    void main() {
      var virDir = new VirtualDirectory("../somewhere_else");
    
      HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 8080).then((server) {
        print("Serving at ${server.address}:${server.port}");
        server.listen((HttpRequest request) {
          var newUriPath = "../somwhere_else/${request.uri.path.replace("/client/","")}";
          virDir.serveFile(new File(newUriPath), request);
        });
      });
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2012-04-10
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多