将 URL 作为 URL 参数传递

时间:2021-06-09 14:10:21

标签: go revel

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

OutputStream

当我使用 URL 作为值调用时

/properties/configurations/:name/:value

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

问题是它在公共 API 中使用,我无法更改它以在正文中传递此数据,因此我试图弄清楚如何让 revel 识别模式并将值正确放入 {name } 和 {value}

2 个答案:

答案 0 :(得分:1)

您只需要使用转义函数之一:

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")
   }
}

答案 1 :(得分:0)

如果您能够将 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 编码)。