【问题标题】:Passing a URL as URL param将 URL 作为 URL 参数传递
【发布时间】:2021-06-09 14:10:21
【问题描述】:

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

/properties/configurations/:name/:value

当我使用 URL 作为值调用时

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

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

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

【问题讨论】:

  • 可以将这些值作为 url 查询值发送吗?

标签: go revel


【解决方案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")
   }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-19
      • 2010-12-18
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      相关资源
      最近更新 更多