Я сгенерировал простой gorilla/mux
API, используя swagger.
Для моей единственной конечной точки /v1/abc/{arg}
я передаю аргумент.
Поэтому запрос типа: http://localhost:9090/v1/abc/hello
пока просто повторяет аргумент.
Следующая функция обрабатывает запрос:
func GetAbcByArg(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
vars := mux.Vars(r)
arg, _ := url.QueryUnescape(vars["arg"])
log.Printf("arg %s", arg)
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "%v\n", arg)
}
Пока все хорошо. Однако всякий раз, когда я пытаюсь передать некоторые специальные символы в качестве аргумента, я получаю ошибку 404, и обработчик не вызывается. Хотя я мог просто избежать аргумента, полностью экранируя символы URL (rfc3986), но это также не работает. Зачем? Как подготовить любую строку, чтобы передать ее в одном элементе?
Примеры:
http://localhost:9090/v1/abc/hello
работает как положено
http://localhost:9090/v1/abc/123/xyz
не работает должным образом
http://localhost:9090/v1/abc/a.x
работает как положено
http://localhost:9090/v1/abc/https://google.com
не работает должным образом
http://localhost:9090/v1/abc/https%3A%2F%2Fgoogle.com
не работает, но почему ?
UPDATE
Настройка маршрута:
var routes = Routes{
Route{
"GetAbcByArg",
strings.ToUpper("Get"),
"/v1/abc/{arg}",
GetAbcByArg,
},
}