Как мне перейти к каталогу?

Я играю с afBedSheet и хочу обработать все запросы к каталогу. например, запрос к /abcd вызывает abcdMethod#doSomething

У меня есть маршруты, настроенные как

@Contribute { serviceId="Routes" }
static Void contributeRoutes(OrderedConfig conf) {
  conf.add(Route(`/abcd/?`, abcdMethod#doSomething))
}

Тем не менее, когда я просматриваю /abcd, я получаю 404 ошибки:(

Как мне сделать эту работу?

1 ответ

Решение

Убедитесь, что ваш метод обработчика маршрута doSomething() НЕ принимает никаких аргументов. Например, сохраните следующее как Example.fan:

using afIoc
using afBedSheet

class MyRoutes {
  Text abcdMethod() {
    return Text.fromPlain("Hello from `abcd/`!")
  }
}

class AppModule {
  @Contribute { serviceId="Routes" }
  static Void contributeRoutes(OrderedConfig conf) {
    conf.add(Route(`/abcd/?`, MyRoutes#abcdMethod))
  }
}

class Example {
  Int main() {
    afBedSheet::Main().main([AppModule#.qname, "8080"])
  }
}

И запустить его с:

> fan Example.fan -env dev

(добавление -env dev перечислит все доступные маршруты на странице 404.)

Так как /abcd/? имеет отставание ?, он будет соответствовать как URL файла http://localhost:8080/abcd и URL-адрес каталога http://localhost:8080/abcd/, Но обратите внимание, что он не будет соответствовать ни одному URL внутри /abcd,

Для сопоставления файлов внутри /abcdдобавьте параметр Uri в метод маршрута (для захвата пути) и измените маршрут на:

/abcd/**  only matches direct descendants --> /abcd/wotever

/abcd/*** will match subdirectories too   --> /abcd/wot/ever

Например:

using afIoc
using afBedSheet

class MyRoutes {
  Text abcdMethod(Uri? subpath) {
    return Text.fromPlain("Hello from `abcd/` - the sub-path is $subpath")
  }
}

class AppModule {
  @Contribute { serviceId="Routes" }
  static Void contributeRoutes(OrderedConfig conf) {
    conf.add(Route(`/abcd/***`, MyRoutes#abcdMethod))
  }
}

class Example {
  Int main() {
    afBedSheet::Main().main([AppModule#.qname, "8080"])
  }
}
Другие вопросы по тегам