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 的一个很好的表示
想到的解决方案如下:
- 首先
- 创建
web/user/user.html
和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
-like url。
另一种方法是额外配置红石,如下所示:
@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).
假设我配置红石如下
@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
.
想到的解决方案如下:
- 首先
- 创建
web/user/user.html
和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
-like url。
另一种方法是额外配置红石,如下所示:
@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).