HTTP 报文解析

Jackey Golang 1,673 次浏览 , 没有评论

获取请求报文

请求报文格式说明

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

 

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

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]))
}

 

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go