我正在学习网络编程并理解外向,但我迷失在这三条显而易见的简单路线中:
fs := http.FileServer(http.Dir("public"))
handler := http.StripPrefix("/static/", fs)
mux.Handle("/static/", handler)
...我已经阅读了以下行的go src,这是我可以推断的:
http.Dir("public")
正在投射字符串" public"输入Dir。go c.serve(ctx)
func (srv *Server) Serve(l net.Listener) error {}
/public/
conda update --all
目录中的每个静态文件都由我们的服务器同时提供。有人可以确认或解释3行代码中究竟发生了什么。
答案 0 :(得分:4)
在查看文档后,我认为这是发生的事情:
http.Dir("public")
您要将string
"public"
转换为实现Dir
界面的类型FileSystem
fs := http.FileServer(http.Dir("public"))
根据docs确实:
FileServer返回一个处理HTTP请求的处理程序 以root为根的文件系统的内容。
root
是您作为参数传递的Dir
handler := http.StripPrefix("/static/", fs)
您将Handler
fs
打包在由StripPrefix
func
Handler
中
根据docs确实:
StripPrefix返回一个处理程序,通过删除来处理HTTP请求 来自请求URL的Path的给定前缀并调用处理程序 ħ
h
是您作为参数传递的Handler
fs
mux.Handle("/static/", handler)
您允许以/static/
handler
路径开头的所有请求
因此,简而言之,对路径/static/
的所有请求都将被删除/static/
前缀,并将从您服务器上的public
目录返回一个具有相同名称的文件,例如。对/static/requestedFile.txt
的请求将返回public/requestedFile.txt
答案 1 :(得分:2)
当前正在浏览Soham Kamani的GoLang教程,发现他的解释可以帮助很多人:
func newRouter() *mux.Router {
r := mux.NewRouter()
r.HandleFunc("/hello", handler).Methods("GET")
// Declare the static file directory and point it to the
// directory we just made
staticFileDirectory := http.Dir("./assets/")
// Declare the handler, that routes requests to their respective filename.
// The fileserver is wrapped in the `stripPrefix` method, because we want to
// remove the "/assets/" prefix when looking for files.
// For example, if we type "/assets/index.html" in our browser, the file server
// will look for only "index.html" inside the directory declared above.
// If we did not strip the prefix, the file server would look for
// "./assets/assets/index.html", and yield an error
staticFileHandler := http.StripPrefix("/assets/", http.FileServer(staticFileDirectory))
// The "PathPrefix" method acts as a matcher, and matches all routes starting
// with "/assets/", instead of the absolute route itself
r.PathPrefix("/assets/").Handler(staticFileHandler).Methods("GET")
return r
}
答案 2 :(得分:0)
确认:
您正在为静态文件注册自动处理程序。形式为GET /static/some_file
的请求将通过从/public
目录提供文件来同时处理。