0x01:两种方法对比
在我们客户端与服务器之间进行请求和响应的时候,最常用的两种方法是:GET和POST
POST —— 向指定的资源提交要被处理的数据。
GET —— 向指定的资源请求数据
GET请求参数呢一般显示在URL上面
POST请求参数是在请求体里面,而不是在URL上面,相对于GET,更具有隐蔽性。
0x02:POST请求
POST请求的一个具体例子可以是用户注册的场景。当用户在一个网站上填写注册表单时,通常需要输入用户名、密码、邮箱等信息。当用户点击提交按钮后,这些信息会通过POST请求发送到服务器进行处理。
在这个过程中,浏览器会构建一个包含注册信息的POST请求。请求头中会指定请求方法为POST,以及请求的URL地址(通常是处理注册的服务器接口)。请求体则会包含用户填写的表单数据,这些数据通常以键值对的形式存在。
一个POST请求包一般包含以下几个部分:
-
请求行:这是数据包的第一行,包含请求方法(在这个例子中是POST)、请求的资源路径(即目标URL)以及HTTP协议的版本和类型。例如,请求行可能类似于“POST /register HTTP/1.1”,其中“/register”是用户想要访问的服务器上的特定资源或页面。
-
消息头:消息头包含了若干键值对,这些键值对由w3c定义,具有特殊的含义。它们描述了请求的各种属性,如内容类型(Content-Type)、字符集(Charset)、客户端类型(User-Agent)等。对于POST请求,通常还会包含描述请求体长度的Content-Length头。这些消息头有助于服务器正确解析和处理请求。
-
请求体:这是POST请求数据包的核心部分,包含了实际要发送给服务器的数据。对于用户注册的场景,请求体可能包含用户填写的表单数据,如用户名、密码、邮箱等。这些数据通常以特定的格式编码,如application/x-www-form-urlencoded或multipart/form-data(用于文件上传)。
如下就是一个POST的一个请求包,他的参数在最下面请求体里面。
POST /register HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 31
username=张三&password=123456&email=zhangsan@example.com
- 请求行指定了使用POST方法,目标资源路径是“/register”,并且使用的是HTTP/1.1协议。
- 消息头中包含了Host、Content-Type和Content-Length等字段,用于描述请求的属性。
- 请求体则包含了表单数据,这些数据已经被编码为“application/x-www-form-urlencoded”格式,并通过“&”符号分隔不同的字段。
实际的POST请求数据包可能会更复杂,包含更多的消息头和请求体数据,具体取决于应用程序的需求和HTTP协议的实现。
0x03:GET请求
GET请求主要用于从服务器获取资源。它通过URL传递参数,并返回服务器响应的数据。GET请求是一种无状态、幂等的请求方法,适用于无副作用的操作,如展示网页内容、读取数据、搜索等。它经常用于浏览器URL的地址栏中。
如下就是一个GET的一个请求包,它的参数在URL地址后面。
GET /search?keyword=apple&page=1 HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
- 请求行:
GET /search?keyword=apple&page=1 HTTP/1.1
,指定了使用GET方法,请求的URL地址是/search
,并附加了查询参数keyword=apple
和page=1
。 - 请求头部:包含了关于请求的各种信息,如
Host
指定了请求的主机名,User-Agent
描述了发出请求的浏览器类型和版本,Accept
表示客户端接受的响应内容类型,Accept-Encoding
和Accept-Language
分别表示客户端接受的编码方式和语言。
请注意,GET请求通常不包含请求体,因为GET请求是用来从服务器获取数据的,而不是发送数据。附加的参数是通过URL的查询字符串(即?
后面的部分)来传递的。
此外,实际的GET请求数据包可能还包含其他请求头部字段,具体取决于客户端和服务器之间的通信需求。同时,HTTP请求和响应的详细格式和内容可能因HTTP版本和特定实现的不同而有所差异