网址转义参数无法正确解析

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

以上是关于网址转义参数无法正确解析的主要内容,如果未能解决你的问题,请参考以下文章

iOS:转义网址链接中的特殊字符问题

使用/解析远程变量时如何正确转义单引号? [复制]

微信中发送的网址出现转义字符,该如何做

php接口开发时,数据解析失败问题,字符转义,编码问题

JS函数传递字符串参数(符号转义)

url参数+,&,=,/等转义编码