ResponseWriter
http.ResponseWriter 是一个接口,你可以根据接口,添加一些自己需要的行为:
type ResponseWriter inte**ce {
Header() Header // 添加返回头信息
Write([]byte) (int, error) // 添加返回的内容
WriteHeader(int) // 设置返回的状态码
}
w.WriteHeader() 是一次性的,不能重复设置状态码,否则会有提示信息:
func HttpHandle(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200) // 设置成功
w.WriteHeader(404) // 提示:http: multiple response.WriteHeader calls
w.WriteHeader(503) // 提示:http: multiple response.WriteHeader calls
}
而且需要在 w.Write() 之前设置 w.WriteHeader(),否则是 200。(要先发送状态码,再发送内容)
func HttpHandle(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World"))
w.WriteHeader(404) // 提示:http: multiple response.WriteHeader calls,因为 w.Write() 已发布 HTTP 200
}
http.ResponseWriter 接口过于简单,实际使用会自己实现 ResponseWriter 来使用,比如获取返回的内容:
type MyResponseWriter struct {
http.ResponseWriter
bodyBytes *bytes.Buffer
}
// 覆写 http.ResponseWriter 的方法
func (mrw MyResponseWriter) Write(body []byte) (int, error) {
mrw.bodyBytes.Write(body) // 记录下返回的内容
return mrw.ResponseWriter.Write(body)
}
// Body 获取返回的内容,这个是自己添加的方法
func (mrw MyResponseWriter) Body() []byte {
return mrw.bodyBytes.Bytes()
}
func HttpHandle(w http.ResponseWriter, r *http.Request) {
m := MyResponseWriter{
ResponseWriter: w,
bodyBytes: bytes.NewBuffer(nil),
}
m.Header().Add("Content-Type", "text/html") // 要输出HTML记得加头信息
m.Write([]byte(" |