gpt4 book ai didi

http - 为什么 http.Get 会产生两个请求而不是一个请求?

转载 作者:IT王子 更新时间:2023-10-29 01:50:11 26 4
gpt4 key购买 nike

创建一个测试文件./bower_components/index.html并在./中运行go test

为什么下面的代码打印两行而不是第一行?

./bower_components/index.html                                                  
./bower_components/

输出:

=== RUN   TestRootHandler                                                      
./bower_components/index.html
./bower_components/ ???
--- PASS: TestRootHandler (0.00s)
main_test.go:32: 200 - ./bower_components/Hello World.html
PASS
ok

代码:

// RootHandler for HTTP
func RootHandler(root string, h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, err := os.Open(root + r.URL.Path)
if err != nil {
fmt.Println(err.Error())
h.ServeHTTP(w, r)
return
}
fmt.Println(root + r.URL.Path)
r.URL.Path = root + r.URL.Path
h.ServeHTTP(w, r)
})
}

// TestRootHandler
func TestRootHandler(t *testing.T) {
ts := httptest.NewServer(RootHandler("./bower_components", http.FileServer(http.Dir("./"))))
defer ts.Close()
res, err := http.Get(ts.URL + "/index.html")
if err != nil {
t.Fatal(err)
}
body, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
t.Fatal(err)
}
t.Logf("%d - %s", res.StatusCode, body)
}

如果您不明白这个问题,请告诉我,然后我将设置一个 github 存储库,这样您就可以运行 go test 命令来了解我的意思。

最佳答案

这就是http.FileServer()的方式是写的。引用其文档:

As a special case, the returned file server redirects any request ending in "/index.html" to the same path, without the final "index.html".

这就是您的体验:您正在请求 /bower_components/index.html,因此 http.FileServer() 返回的处理程序发送重定向:

HTTP/1.1 301 Moved Permanently
Location: ./

http.Get()行为良好,遵循此重定向,并执行另一个 HTTP GET,现在没有 index.htmlhttp.FileServer()在这种情况下,处理程序将尝试提供 index.html

关于http - 为什么 http.Get 会产生两个请求而不是一个请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39562489/

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