获取请求报文
请求报文格式说明
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])) }