请求报文

请求报文分为三个部分,请求行请求头请求体,请求体前有一行空行。

1
2
3
4
5
6
7
8
9
10
11
12
POST / HTTP/1.1
User-Agent: PostmanRuntime/7.29.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 4ea68fc6-69d2-40f7-b0e5-b0a6391adba5
Host: 127.0.0.1:8000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

key1=value1

在上面的例子中,第1行为请求行,第2-10行为请求头,第11行为空行分隔,第12行为使用x-www-form-urlencoded编码的表单数据。

响应报文

响应报文分为三个部分,状态行、响应头和响应体,响应体前有一行空行。

1
2
3
4
5
6
HTTP/1.1 200 OK
Date: Wed, 25 May 2022 09:13:48 GMT
Content-Length: 15
Content-Type: text/plain; charset=utf-8

Hello, World!

1行为状态行,第2-4行为响应头,第5行为空行分隔,第6行为响应体。

发送数据

以请求报文为例,我们在使用 HTTP 发送请求时,可以把想要发送的数据放在请求行、请求头或请求体中。

以服务器的会话管理为例,由于HTTP本身是无状态的,因此通常根据客户端发送来的sessionid来确定客户端的身份,常用的方式有以下两种:

第一种是在服务器在返回给用户的页面中,将所有 url 后追加 sessionid,这样用户在收到响应之后,不论是点击链接还是提交表单,服务器都能识别出客户端的身份,从而实现了会话保持。这种情况就是把数据放在请求行中。

1
GET /?sessionid=123456 HTTP/1.1

此外,请求头中的 Cookie 字段也可以用来传输 sessionid,这种情况就是把数据放在请求头中,我们也可以在HTTP的基础上定义自己的请求头。

1
2
GET / HTTP/1.1
Cookie: sessionid=123456

上面的两种方式一般都用来发送结构比较简单的数据,更一般的方式是把数据放在请求体。

由于 HTTP 协议以 ASCII 码来传输,并没有规定请求体的结构,因此开发者可以自己决定请求体的格式,并通过请求头中的Content-Type字段来告诉服务器采用的编码方式。

Content-Type

application/x-www-form-urlencoded

浏览器的<form>表单在未设置enctype属性时,会用application/x-www-form-urlencoded类型来提交数据。

这种类型会把数据按照key1=val1&key2=val2的结构组织,并对keyvalue分别使用UrlEncode编码。

1
2
3
4
5
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 13

key=value%3D1

multipart/form-data

相关文章