0

假设我配置红石如下

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

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

现在我希望能够去,比如说,/user/10得到一个很好的表示我从中得到的这个 json /raw/user/10

我想到的解决方案如下:

  1. 第一的
    • create web/user/user.htmland web/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类似 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 应用程序的例子是神秘而复杂的。

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

4

1 回答 1

2

我猜你正在尝试使用模板引擎在服务器中生成 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 中间件。有关完整的 Redstone + Polymer 示例,请参见此处(shelf_static 在bin/server.dart 文件中配置)。

于 2015-03-04T15:36:38.620 回答