将URL作为URL参数传递



我有一条用路由参数编写的路由

/properties/configurations/:name/:value

当我用URL作为值调用时,就像一样

/properties/configurations/app.url/http://test.test

它没有击中我的Revel控制器,我想是因为斜杠混淆了它。我在用encodeURIComponent((调用Javascript请求时尝试过,所以它删除了斜杠和其他有问题的字符,但它仍然没有击中控制器,并给出404。

问题是它在公共的API中使用,我无法将其更改为在主体中传递这些数据,因此我试图找出如何使reve识别模式并正确地将值放入{name}和{value}中

您只需要使用其中一个转义函数:

package main
import "net/url"
func main() {
s := "http://test.test"
{
t := url.PathEscape(s)
println(t == "http:%2F%2Ftest.test")
}
{
t := url.QueryEscape(s)
println(t == "http%3A%2F%2Ftest.test")
}
}
  • https://golang.org/pkg/net/url#PathEscape
  • https://golang.org/pkg/net/url#QueryEscape

如果您能够将URL编码的URL作为路径变量传递到Golang服务器,则可以通过url.PathUnescape(str)运行它。

如果问题是因为路径变量中的字符不正确匹配,路由器没有到达正确的处理程序,那么可能是您错误地定义了路径匹配器。我没有狂欢的经验,但对于mux(github.com/gorilla/mux(,我希望它看起来如下:

package main
import (
"net/http"
"net/url"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter()
r.HandleFunc("/properties/configurations/app.url/{nestedURL:.*}", myHandler)

http.ListenAndServe(":8080", r)
}
func myHandler(w http.ResponseWriter, r *http.Request){
nestedURL := mux.Vars(r)["nestedURL"]
unescapedPath, err := url.PathUnescape(nestedURL)
if err != nil {
// handle err
}
}

上面的例子甚至可以在不需要对嵌套的URL进行URL编码的情况下工作(但我确实建议您对其进行URL编码(。

最新更新