考虑以下非常基本的“ net / http”程序:
package main
import (
"net/http"
"log"
)
func entry(w http.ResponseWriter, req *http.Request) {
log.Println(req.URL.Path)
path := []byte(req.URL.Path)
w.Write(path)
}
func main() {
http.HandleFunc("/", entry)
err := http.ListenAndServe("localhost:10000", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
访问URL时,http://localhost:10000/a//b
(默认DefaultServerMux
和HandleFunc()
使用的ListenAndServe()
)将其重定向到/a/b
,从而有效地删除了双斜线。
documentation for ServerMux
确实指定了它“清理” URL请求:
ServeMux还负责清理URL请求路径,重定向任何包含的请求。或..元素或重复的斜线表示为等效的,简洁的URL。
但是,如果我不想这么做怎么办?我遇到一种情况,其中URL中的//
!= /
。我可以找到另一个解决方案。但是有没有办法不使用Go的“ net / http”软件包,而又不清理我的URL?最好尽量减少重写。
(我可能会找到与//
和/
截然不同的解决方案,因为我可能会对ServerMux
提供的其他功能感到满意(如果解决方案要求我使用另一个多路复用器),但是现在我很好奇Go的标准“ net / http”包是否有解决方案。)
答案 0 :(得分:1)
让大猩猩多路复用器使用URL路由服务器。默认情况下,http://subdomain.mysite.com/user/edit/1
使用Clean来针对各种不需要的字符修改网址。这就是当您使用DefaultSeveMux
双斜杠时URL更改的原因。
//
如果您不想清理URL。 Gorilla mux提供了SkipClean()方法,该方法设置为true时。它不会清除网址。
func Clean(path string) string
在大猩猩mux的文档中,func (r *Router) SkipClean(value bool) *Router {
r.skipClean = value
return r
}
提到:
SkipClean定义新路线的路径清洗行为。的 初始值为假。用户应注意哪些路线是 未清除如果为true,则路由路径为“ / path // to”时,它将 保持双斜线。如果您有路线,这会很有帮助 例如:/ fetch / http://xkcd.com/534/为false时,路径为 已清理,因此/ fetch / http://xkcd.com/534/将变为 /fetch/http/xkcd.com/534