Передайте URL-адрес в приложение Dart

У меня есть страница со ссылками. Все эти ссылки заканчиваются одинаково. Например, www.site.com/fruit/apples, www.site.com/fruit/bananas, www.site.com/fruit/oranges и т. д. Я хочу, чтобы все эти ссылки вызывали одно и то же приложение Dart, чтобы приложение выполняло некоторую обработку, а затем перенаправляло вас туда, куда вам нужно (страница с бананами или страница с апельсинами). Таким образом, я избегаю фактического HTML-файла для каждого фрукта. Вместо этого я могу иметь один шаблон посадки, который заполняется переменными данными о фруктах.

Часть, на которой я зациклился, - это передача URL-адреса в приложение Dart, чтобы оно могло выполнить обработку. Я так понимаю, что main() не может принимать аргументы, так что по-другому?


person jmoneystl    schedule 20.06.2013    source источник


Ответы (1)


Вы можете использовать пакет маршрута для обработки URL-адресов.

Например:

import 'package:route/client.dart';

final fruitUrl = new UrlPattern(r'/fruit/(\w+)');

main() {
  var router = new Router()
    ..addHandler(fruitUrl, showFruit)
    ..listen();
}

void showFruit(String path) {
  var fruit = fruitUrl.parse(req.path)[0];
  // Display the page according to the fruit type
}

Если вам не нужно обрабатывать фактические маршруты, и вы просто хотите обрабатывать любые параметры запроса, переданные в форме ?fruit=apple, вам не нужно использовать пакет маршрутов и вместо этого можно вручную проанализировать URL-адрес:

Map params = {};

// If arguments were provided, decode them into params map
if(window.location.search.length > 1) {
  // Break all arguments into form: fruit=apple
  List<String> queryPairs = window.location.search.substring(1).split('&');
  for(String queryPair in queryPairs) {
    // Add arguments into params map: key=fruit, value=apple
    List<String> queryPairList = queryPair.split('=');
    params[queryPairList[0]] = queryPairList[1];
  }
}

// Handle the proper action based on the fruit
switch(params['fruit']) {
  case 'apple':
    // ...
    break;
    // ...
  case 'orange':
    // ...
    break;
}
person Pixel Elephant    schedule 20.06.2013
comment
Я продолжаю получать Breaking on exception: Illegal argument(s): No handler found for /web/out/entry_page.html. Я тестирую в редакторе Dart, а также на веб-сервере. Та же ошибка. - person jmoneystl; 21.06.2013
comment
Код, который я предоставил, будет обрабатывать только URL-адреса, начинающиеся с /fruit. Вам нужно будет добавить еще один обработчик для обработки entry_page.html (добавьте новый UrlPattern, метод для его обработки, а затем обработчик маршрутизатора, который их свяжет). Кроме того, придерживайтесь веб-сервера только при тестировании маршрутов, поскольку существует проблема с Dart Editor, которая не позволяет ему работать должным образом (Dart Editor обслуживает файлы из пути локальной файловой системы, который не соответствует указанному маршруту). - person Pixel Elephant; 21.06.2013
comment
Что мне действительно нужно, так это способ разобрать запрос в стиле ?fruit=. Я должен был прояснить это раньше, но я думаю, что логика та же, но регулярное выражение другое. Однако я не могу избежать этого исключения. Я заметил, что когда я выполняю развертывание, пакет маршрута не отображается в папке развертывания/вывода. Не знаю, связано ли это с этим. - person jmoneystl; 21.06.2013
comment
В этом случае нет необходимости использовать пакет маршрутов. Вы можете вручную анализировать параметры URL. Я обновил свой ответ. - person Pixel Elephant; 21.06.2013