【问题标题】:Dart redstone web applicationDart 红石网络应用程序
【发布时间】:2015-03-04 13:32:40
【问题描述】:

假设我如下配置红石

    @app.Route("/raw/user/:id", methods: const [app.GET])
    getRawUser(int id) => json_about_user_id;

当我运行服务器并转到 /raw/user/10 时,我会以字符串形式获得原始 json 数据。

现在我希望能够转到 /user/10 并获得我从 /raw/user/10 获得的这个 json 的一个很好的表示。

我想到的解决方案如下:

  1. 第一
    • 创建web/user/user.htmlweb/user/user.dart,配置后者在index.html被访问时运行
    • user.dart 监控查询参数(user.dart?id=10),提出适当的请求并在user.html 中显示所有内容,即
         var uri = Uri.parse( window.location.href );
         String id = uri.queryParameters['id'];
         new HttpRequest().getString(new Uri.http(SERVER,'/raw/user/${id}').toString() ).then( presentation )

这个解决方案的一个缺点是我根本没有实现/user/10-like url。

  1. 另一种方法是额外配置红石如下:

    @app.Route("/user/:id", methods: const [app.GET])
    getUser(int id) => app.redirect('/person/index.html?id=${id}');
    

在这种情况下,至少允许像“/user/10”这样的网址,但这根本行不通。

我将如何正确地做到这一点?在我看来,redstone 的 git 上的 web 应用程序的例子是神秘而复杂的。

我不确定这是否必须仅与红石或飞镖有关,但我找不到任何相关内容。

【问题讨论】:

    标签: web dart redstone.dart


    【解决方案1】:

    我猜你正在尝试使用模板引擎在服务器中生成 html 文件。 Redstone 主要是为了构建服务而设计的,所以它没有内置的模板引擎,但是你可以使用任何 pub 上可用的引擎,例如mustache。虽然,如果你使用 Polymer、AngularDart 或其他实现客户端模板系统的框架,你不需要在服务器中生成 html 文件。

    另外,如果你想复用其他服务,你可以直接调用它们,例如:

    @app.Route("/raw/user/:id")
    getRawUser(int id) => json_about_user_id;
    
    @app.Route("/user/:id")
    getUser(int id) {
      var json = getRawUser();
      ...
    }
    

    Redstone v0.6(仍处于 alpha 阶段)还包括一个新的 foward() 函数,您可以使用它在内部分派请求,不过,响应是作为shelf.Response 对象接收的,因此您必须阅读它:

    @app.Route("/user/:id")
    getUser(int id) async {
      var resp = await chain.forward("/raw/user/$id");
      var json = await resp.readAsString();
      ...
    }
    

    编辑:

    要提供静态文件,例如在浏览器中执行的 html 文件和 dart 脚本,您可以使用shelf_static middleware。有关完整的 Redstone + Polymer 示例,请参阅 here(shelf_static 在 bin/server.dart file 中配置)。

    【讨论】:

    • 基本上,我的问题归结为以下几点。一旦我的红石服务器在某些 url 上使用 json 响应,我将如何使用 dart 脚本提供网页?该 dart 脚本将在客户端上运行,从服务器请求数据并使用 Polymer 或 AngularDart 呈现这些数据。这完全可以用红石来实现吗?
    • 我已经编辑了答案,其中包含有关如何为客户端代码提供服务的信息。
    • 很有趣,我很久以前就发现了如何在 redstonedart.org 上提供静态文件,但直到现在才设法让它工作,即让 dart 客户端脚本运行。这个错误非常愚蠢:Chromium 缓存了空脚本和 html 页面,尽管我编辑了它们并看到 redstone 为它们提供服务,但它们从未运行过。在我设法让它运行之后,我想在 stackoverflow 上这么说,但我比你的编辑晚了 3 分钟。谢谢。
    • 为了完成我的评论,我将给出一段代码(特定于红石)防止缓存飞镖脚本:@app.Interceptor(r'/.*\.dart') noCache(){ app.chain.next((){ app.response = app.response.change(headers:{ "Cache-Control" : "max-age=0, no-cache, no-store, must-revalidate", "Pragma": "no-cache", "Expires": "Wed, 11 Jan 1984 05:00:00 GMT" }); }); }@luizmineo,看来这篇文章可以完成你的答案。
    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多