Go net/http包中的ResponseWriter接口



关于net/http包中的ResponseWriter接口,我有两个问题。这是我的代码

package main
import (
"fmt"
"net/http"
"os"
)
type handler struct{}
func (h *handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Method: %vn", req.Method)
fmt.Fprintf(w, "URL: %vn", req.URL)
fmt.Fprintf(w, "Protocol: %vn", req.Proto)
fmt.Fprintf(os.Stdout, "Header: %vn", w.Header())
}
func main() {
http.ListenAndServe(":8080", &handler{})
}

为了检查我在cmd中使用的curl代码。下面您可以看到curl命令及其结果。

C:Users>curl -i -X GET localhost:8080
HTTP/1.1 200 OK
Date: Fri, 19 Aug 2022 03:47:21 GMT
Content-Length: 38
Content-Type: text/plain; charset=utf-8
Method: GET
URL: /
Protocol: HTTP/1.1

自http。ResponseWriter只是一个接口,我的程序中没有实现任何具体的类型来满足这个接口,为什么我的代码可以工作?据我所知,还没有接口方法的实现。那么,如何从curl中得到正确的响应呢?

此外,正如您在curl的输出中看到的,我收到了一个带有标头的http响应。然而,fmt.Fprintf(os.Stdout, "Header: %vn", w.Header())的输出是Header: map[]。如果我是对的,http的Header方法。ResponseWriter必须返回基于curl输出的非空响应标头。那么为什么Fprintf会返回一个空映射呢?

谢谢你的帮助。

自http。ResponseWriter只是一个接口,我的程序中没有实现任何具体的类型来满足这个接口,为什么我的代码可以工作?

还没有;标准库具有(即专用http.responsehttp.http2responsewriter类型(。http服务器将其中一个类型的实例传递给处理程序。你不需要知道它是什么;您只知道,无论您得到什么,它都将实现ResponseWriter方法。

为什么Fprintf返回一个空映射?

因为映射为空,因为您没有设置任何标头。如果您不自己设置某些服务器(如DateContent-Type(,它们可以由服务器自动设置,但这种情况发生在打印点之后。

最新更新