网址转义参数无法正确解析
Posted
技术标签:
【中文标题】网址转义参数无法正确解析【英文标题】:Url escaped parameter not resolving properly 【发布时间】:2019-04-16 21:01:31 【问题描述】:我使用 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,
,
【问题讨论】:
请在您设置路线的地方发布代码。根据您的示例“工作/不工作”,您似乎想要一个PathPrefix
路由...(Solidi 在 URL 中具有特殊含义;它们分隔路径元素。您的路由将与一个路径元素完全匹配为 arg .)
我已经添加了路线。但是,为什么即使我在逃避它,参数也会分开?
【参考方案1】:
它正在使用
router := mux.NewRouter().SkipClean(true).UseEncodedPath()
参考:https://github.com/gorilla/mux/blob/master/mux.go
【讨论】:
【参考方案2】:替换这个页面地址中的/之一仍然指向这个页面:
https://***.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 之后只允许一个部分
【讨论】:
见github.com/gorilla/mux/issues/77和github.com/lighthouse-isu/lighthouse/issues/30以上是关于网址转义参数无法正确解析的主要内容,如果未能解决你的问题,请参考以下文章