我使用swagger生成了一个简单的gorilla/mux
API。对于我的单一终点/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
不工作,但为什么?
路线设置:
var routes = Routes{
Route{
"GetAbcByArg",
strings.ToUpper("Get"),
"/v1/abc/{arg}",
GetAbcByArg,
},
}
替换此页面地址中的一个仍然指向此页面:
https://stackoverflow.com/questions/55716545%2Furl-escaped-parameter-not-resolving-properly
所以我想
http://localhost:9090/v1/abc/https%3A%2F%2Fgoogle.com
被视为http://localhost:9090/v1/abc/https%3A//google.com
通过你的路由器,它似乎不允许abc之后的任何一个部分
它正在与之合作
router := mux.NewRouter().SkipClean(true).UseEncodedPath()