关于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.response
和http.http2responsewriter
类型(。http服务器将其中一个类型的实例传递给处理程序。你不需要知道它是什么;您只知道,无论您得到什么,它都将实现ResponseWriter
方法。
为什么Fprintf返回一个空映射?
因为映射为空,因为您没有设置任何标头。如果您不自己设置某些服务器(如Date
和Content-Type
(,它们可以由服务器自动设置,但这种情况发生在打印点之后。