Дарт Редстоун веб-приложение

Допустим, я настраиваю 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,

Решения, которые приходят мне в голову, следующие:

  1. Первый
    • Создайте 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 вообще.

  1. Другой способ заключается в дополнительной настройке 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).

Другие вопросы по тегам