2016-03-23 5 views
0

Я пытаюсь использовать маршрутизатор-маршрутизатор Gorilla для обработки путей, которые отвечают на ограниченный список строк в URL-адресе. Служба, которую я разрабатываю, будет принимать файлы от вызывающего и передавать их через «адаптер», который отправляет их на S3 или OneDrive, в зависимости от «адаптера», указанного в URL-адресе. Мне также нужна переменная с именем «schema», о которой я упоминаю сейчас только из-за странности, которая следует. Мой тест выглядит следующим образом ({схема} будет установлен на «тест»):Как получить шаблон OR в маршрутизации маршрутизации Gorilla

router.HandleFunc("/{adapter:(s3|onedrive)}/{schema:[a-z]+}/check", 
func(w http.ResponseWriter, r *http.Request) { 
    w.Write([]byte(fmt.Sprintf(`{"a":"%s","s":"%s"}`, 
     mux.Vars(r)["adapter"], mux.Vars(r)["schema"]))) 
}).Methods("GET") 

Я бы ожидать, что собирается /s3/test/check даст {"a":"s3","s":"test"} так же, как собирается /onedrive/test/check должен уступить {"a":"onedrive","s":"test"} ... Однако в этих случаях Я получаю {"a":"s3","s":"s3"} и {"a":"onedrive","s":"onedrive"} соответственно.

(s3|onedrive) чек, кажется, быть приведено в исполнение, так как, например, пытаясь перейти к /dropbox/test/check правильно дает 404.

Почему {schema} переменная получает значение переменной {adapter} и как я могу это исправить?

ответ

2

Я думаю, что это из-за круглых скобок, которые обозначают захватную группу и дают подделку. Это может помешать согласованию горилл. Просто попробуйте без скобок.

router.HandleFunc("/{adapter:s3|onedrive}/{schema:[a-z]+}/check",