gpt4 book ai didi

http - 如何在 Golang 路由中将 URL 作为参数传递?

转载 作者:IT王子 更新时间:2023-10-29 01:58:04 25 4
gpt4 key购买 nike

我试图在 Golang 中将 URL 作为参数传递,但我无法在我看过的所有教程中找到解决方案。问题是我只能得到要返回的 url 减去关键的正斜杠。

我的处理程序如下所示:

router.HandleFunc("/new/{url}", createURL)

所以请求看起来像:

www.myapp.heroku.com/new/https://www.google.com

但是,我得到的 url 缺少一个斜杠:

http:/www.google.com

我确定这可能与 RFC3986 有关,但是有没有办法按原样传递 url?

最佳答案

看完the other question ,我明白你的意思。在 URL 转到 gorilla/mux 之前实现一种 URL 重写器。该函数将如下所示:

func Rewriter(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
//Simple URL rewriter. Rewrite if it's started with API path
pathReq := r.RequestURI
if strings.HasPrefix(pathReq, "/new/") {
//Use url.QueryEscape for pre go1.8
pe := url.PathEscape(strings.TrimLeft(pathReq, "/new/"))
r.URL.Path = "/new/" + pe
r.URL.RawQuery = ""
}

h.ServeHTTP(w, r)
})
}

启动http服务器时包装 gorilla 路由器:

r := mux.NewRouter()

// ... other handler
r.HandleFunc("/new/{original-url}", NewHandler)

//Wrap mux.Router using Rewriter
log.Fatal(http.ListenAndServe(":8080", Rewriter(r)))

然后在您的 URL shortener 处理程序中,可以使用以下代码提取原始 URL:

func NewHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
ou := vars["original-url"]
//Use url.QueryUnascape for pre go1.8
originalURL, err := url.PathUnescape(ou)

//... other processing
}

恕我直言,不推荐像这样实现 URL shortener 服务,主要是因为 HTTP 动词的使用不正确。任何 GET 请求都不应在服务器中留下副作用,例如没有在数据库中创建记录等。

关于http - 如何在 Golang 路由中将 URL 作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43635701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com