Get 与 Post
# 语义上的区别
根据RFC规范:
- GET 的语义是从服务器获取指定的资源;
- POST 的语义是根据请求负荷(报文body)对指定的资源做出处理;
# 格式上的区别
GET 请求的参数放在 URL 中,且 URL 长度受到浏览器和服务器的限制;
GET /signin?next=%2F HTTP/2\r\n Host: www.zhihu.com\r\n User-Agent: Mozilla/5.0\r\n Accept: */*\r\n Accept-Language: zh-CN\r\n Accept-Encoding: gzip, deflate\r\n Connection: keep-alive\r\n Upgrade-Insecure-Requests: 1\r\n Cache-Control: max-age=0\r\n TE: trailers\r\n \r\n
1
2
3
4
5
6
7
8
9
10
11POST 请求的参数放在 请求体 中,可以有多种编码格式,如
application/x-www-form-urlencoded
,multipart/form-data
,application/json
等;且请求的 body 大小没有限制;POST /login HTTP/1.1\r\n Host: 127.0.0.1:8888\r\n User-Agent: Mozilla/5.0\r\n Accept: */*\r\n Accept-Language: zh-CN\r\n Accept-Encoding: gzip, deflate\r\n Content-Type: application/x-www-form-urlencoded\r\n Content-Length: 29\r\n Connection: keep-alive\r\n \r\n username=root&password=123456
1
2
3
4
5
6
7
8
9
10
11POST请求体的文件中如果出现 \r\n 会不会导致请求体解析结束?
不会,只有请求头最后一个
\r\n
的空行作为结束的标志,且请求头中的Content-Length有请求体字段长度,会把所有长度范围内的字段都作为请求体部分;
# 幂等性区别
GET 请求是幂等的,即多次重复执行不会改变资源的状态,所以 GET 请求的数据可以被缓存;
POST 请求是不幂等的,因为是「新增或提交数据」的操作,会修改服务器上的资源,所以也是不安全的;
如果GET和POST都用 HTTP 请求,都是不安全的,因为 HTTP 协议本身是明文传输的,必须使用 HTTPS 协议来加密传输数据;