Как получить шаблон ИЛИ в Gorilla MUX Routing

Я пытаюсь использовать маршрутизатор muilla Gorilla для обработки путей, которые отвечают на ограниченный список строк в URL. Разрабатываемая мной служба будет принимать файлы от вызывающей стороны и передавать их через "адаптер", который отправляет их на S3 или OneDrive, в зависимости от "адаптера", указанного в URL-адресе. Мне также требуется переменная с именем "схема", о которой я сейчас упоминаю только из-за странностей, которые следуют. Мой тест выглядит следующим образом ({схема} будет установлена ​​на "тест"):

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} переменная и как я могу это исправить?

1 ответ

Решение

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

router.HandleFunc("/{adapter:s3|onedrive}/{schema:[a-z]+}/check",
Другие вопросы по тегам