Dart 红石 Web 应用程序

Dart redstone web application

假设我配置红石如下

    @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”这样的网址,但这根本行不通。

我该如何正确地做到这一点?在我看来,红石 git 上的网络应用程序示例是神秘且复杂的。

我不确定这是否必须仅通过与红石或飞镖的连接来解释,但我找不到任何相关内容。

我猜您正在尝试使用模板引擎在服务器中生成 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. See here for a complete Redstone + Polymer example (shelf_static is configured in the bin/server.dart file).