HTTP 请求与响应之响应

request_message

request_message

一个响应可以由一下几个部分,协议,状态码,状态消息,响应头,消息体组成。

在go中的http.ResponseWriter是一个接口,它的原型如下:

type ResponseWriter interface {
    Header() Header

    Write([]byte) (int, error)

    WriteHeader(statusCode int)
}

状态以及状态码

func greet(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(200)
}

这里只需要传递对应的数值就可以了,对应的状态说明包会自动添加

请求头

请求头是一个type Header map[string][]string类型,该类型实现了和之前说的请求头的获取中的方法因此

func greet(w http.ResponseWriter, r *http.Request) {
	w.Header().Add("Serve", "Go web server")
}

消息体

消息体是一个[]byte类型,因此在发送消息体之前需要将消息体转换成该格式,

对于消息体而言其主要有以下几种格式:string,JSON,XML,FILE

字符串

func greet(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "response string type")
	w.Write([]byte("hello Golang"))
}

JSON

func greet(w http.ResponseWriter, r *http.Request) {
	var s = make(map[string]string)
	s["a"] = "a"
	s["b"] = "b"

	res, err := json.Marshal(s)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
    }
    w.Header().Set("Content-Type", "application/json")
	w.Write(res)
}

需要注意的是:

File

使用http.ServeFile方法可以直接读取并返回文件的内容

func greet(w http.ResponseWriter, r *http.Request) {
	filePath := path.Join(".", "index.text")
	http.ServeFile(w, r, filePath)
}

单然设置特定的头部信息,可以作为一个静态文件来下载

func greet(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Disposition", "attachment; filename=index.text")

	filePath := path.Join(".", "index.text")
	http.ServeFile(w, r, filePath)
}

参考文档