Как мне перейти к каталогу?
Я играю с 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"])
}
}