Дарт Редстоун веб-приложение
Допустим, я настраиваю Redstone следующим образом
@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
,
Решения, которые приходят мне в голову, следующие:
- Первый
- Создайте
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
подобные URL вообще.
Другой способ заключается в дополнительной настройке Redstone следующим образом:
@app.Route("/user/:id", methods: const [app.GET]) getUser(int id) => app.redirect('/person/index.html?id=${id}');
в этом случае разрешены как минимум URL-адреса типа "/user/10", но это просто не работает.
Как бы я сделал это правильно? Пример веб-приложения на Redstone Git, на мой взгляд, загадочно и запутанно.
Я не уверен, нужно ли это объяснять только подключением к Редстоуну или Дротику, но я не могу найти ничего связанного с этим.
1 ответ
Я предполагаю, что вы пытаетесь генерировать HTML-файлы на сервере с помощью шаблонизатора. Redstone был разработан главным образом для создания сервисов, поэтому он не имеет встроенного шаблонизатора, но вы можете использовать любой движок, доступный в пабе, например, усы. Хотя, если вы используете Polymer, AngularDart или другой frameowrk, который реализует систему шаблонов на стороне клиента, вам не нужно генерировать 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 (все еще в альфа- версии) также включает в себя новую функцию 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).