gpt4 book ai didi

http - Golang路由前修改URL路径等HTTP请求参数

转载 作者:IT王子 更新时间:2023-10-29 02:15:41 31 4
gpt4 key购买 nike

在某些情况下,通常的做法是将纯 URI 作为路径后缀而不是查询参数传递。这是 Internet Archive 的 Wayback Machine 中的示例。

https://web.archive.org/web/20150825082012/http://example.com/

在此示例中,用户正在请求在 2015-08-25 08:20:12 捕获的 http://example.com/ 的副本。如果我们要在 Go 中实现类似的服务,我们可能会有一个如下所示的路由器:

http.HandleFunc("/web/", returnArchivedCopy)

然后在returnArchivedCopy 处理函数中,我们将拆分r.URL.Path(其中r 是Request 对象)以提取日期时间和目标 URL。但是,这种 URL 方案存在一个问题; Go 的 net/http 包在路径部分调用 cleanPath 函数来清理它。此清理过程执行各种清理任务,例如从路径中删除 ... 并将多个斜杠替换为单个斜杠。后面的操作是有意义的,因为在 Unix 系统中,文件路径中的 /// 相同。然而,这会在上述用例中引起问题,因为 http://example 变为 http:/example 并且服务器在内部向客户端返回重定向响应路径。

我想知道,在这种情况下我有什么选择?有没有办法要求 HTTP 在仍然利用默认(或稍作修改的)服务器、多路复用器和处理程序附带的所有默认行为的同时不清理请求路径?或者有没有办法在它达到多路复用器的路由模式之前修改请求参数(在这种情况下为路径)。如果后者可行,我们可能会尝试执行 URL 编码之类的操作来避免重定向,然后在提取所需位之前在处理函数中对 URL 进行解码。

我已经尝试过一些自定义处理程序和多路复用器,但我是 Go 的新手,因此我不太确定在更改请求后如何将路由委托(delegate)回默认处理程序。

最佳答案

您可以实现一个包装器复用器,它会回退到默认的复用器,这是一个非常简单的示例:

func main() {
http.HandleFunc("/blah", func(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("w00t"))
})
http.ListenAndServe(":9090", http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
p := strings.SplitN(req.URL.RequestURI()[1:] /*trim the first slash*/, "/", 3)
if len(p) != 3 || p[0] != "web" {
http.DefaultServeMux.ServeHTTP(w, req)
return
}

t, err := time.Parse("20060102150405", p[1])
if err != nil {
http.Error(w, "invalid time", 400)
return
}
url := p[2]
fmt.Fprintf(w, "requested url %v @ %v", url, t)
}))
}

关于http - Golang路由前修改URL路径等HTTP请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32261308/

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