获取请求报文

请求报文格式说明
HTTP请求报文由请求行、请求头、空行、请求体四个部分组成,如下图:

- 请求行
请求行由方法字段和HTTP协议版本字段3个部分组成,他们呢之间使用空格隔开。
HTTP请求方法由GET、POST
GET:
当客户端要从服务器中读取某个资源时,使用GET方法。GET方法要求服务器将URL定位的资源放在相应报文的数据部分,回送给客户端,即向服务器请求某个资源。
使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制,因此GET方法不适合用于上传数据.
通过GET方法来获取网页时,参数会显示在浏览器地址栏上,一次保密性很差.
POST:
当客户端给服务器提供信息较多时,可以使用POST方法,POST方法想服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理。
GET一般用于获取/查询资源信息,POST会附带用户数据,一般用户更新资源信息。POST方法将请求参数封装在HTTP请求数据中,而且长度没有限制,因为POST携带的数据,在HTTP请求正文中以名称/值的形式出现,可以传输大量数据。 - 请求头
Host
属于请求字段,只能出现在请求头里,它同时也是唯一一个 HTTP/1.1 规范里要求必须出现的字段,也就是说,如果请求头里没有 Host,那这就是一个错误的报文。Host 字段告诉服务器这个请求应该由哪个主机来处理,当一台计算机上托管了多个虚拟主机的时候,服务器端就需要用 Host 字段来选择,有点像是一个简单的“路由重定向”。User-Agent
请求字段,只出现在请求头里。它使用一个字符串来描述发起 HTTP 请求的客户端,服务器可以依据它来返回最合适此浏览器显示的页面。Date
是一个通用字段,但通常出现在响应头里,表示 HTTP 报文创建的时间,客户端可以使用这个时间再搭配其他字段决定缓存策略。Server
响应字段,只能出现在响应头里。它告诉客户端当前正在提供 Web 服务的软件名称和版本号。Content-Length
它表示报文里 body 的长度,也就是请求头或响应头空行后面数据的长度。服务器看到这个字段,就知道了后续有多少数据,可以直接接收。如果没有这个字段,那么 body 就是不定长的,需要使用 chunked 方式分段传输。 - 空行
必须有,用\r\n表示,用来表示请求头的结束 - 请求体
请求对应的数据内容
Go 创建HTTP服务端
// 回调函数
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello https://ijackey.com"))
}
func main() {
// 指定路由
http.HandleFunc("/jackey", handler)
// 指定监听端口
http.ListenAndServe("0.0.0.0:8080", nil)
}
HTTP响应报文

客户端的创建
func main() {
// 创建客户端连接
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Print("net.Dial", err)
return
}
defer conn.Close()
// 拼装请求报文
httpRequest := "GET /jackey HTTP/1.1\r\n" +
"Host:127.0.0.1:8080\r\n" +
"\r\n"
conn.Write([]byte(httpRequest))
// 接受服务端的返回信息
buffer := make([]byte, 4096)
n, _ := conn.Read(buffer)
fmt.Println(string(buffer[:n]))
}