Golang提供静态文件,请解释这三行代码中发生的情况

时间:2017-10-21 19:56:24

标签: go

我正在学习网络编程并理解外向,但我迷失在这三条显而易见的简单路线中:

fs := http.FileServer(http.Dir("public"))
handler := http.StripPrefix("/static/", fs)
mux.Handle("/static/", handler)

...我已经阅读了以下行的go src,这是我可以推断的:

  1. http.Dir("public")正在投射字符串" public"输入Dir。
  2. 然后我们使用http.FileServer()
  3. 提供文件(包括其所有内容)
  4. 我们删除前缀,因为现在我们在fs
  5. 的handleFunc()中
  6. StripPrefix()创建了一个HandlerFunc()
  7. mux.Handle()在多路复用器中注册HandlerFunc()。
  8. 深陷兔子洞...然后go c.serve(ctx) func (srv *Server) Serve(l net.Listener) error {}
  9. 这个goroutine /public/
  10. 因此conda update --all目录中的每个静态文件都由我们的服务器同时提供。
  11. 有人可以确认或解释3行代码中究竟发生了什么。

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目录提供文件来同时处理。