方法(method)
首行中的第一部分。首行是由方法、URL 和版本号组成
方法描述了这次请求想干什么,最主要的是:
GET
:从服务器拿一个东西过来(读操作)POST
:往服务器放一个东西(写操作)
- 这些方法的语义,都是“标准文档作者”的一厢情愿,仅供参考
- 但开发者在实际开发程序的时候,才不管这一套。完全可以用
POST
来从服务器拿数据,也完全可以用GET
往服务器放数据
GET
是很常见的,两个典型使用 POST
的场景:
- 登录
- 上传
从使用习惯上说,GET
通常没有 body
,而 POST
通常有。GET
会把需要给服务器的补充信息放到 query string
中(URL
中),而 POST
会把这些信息放到 body
中
登录
- 这里
body
里面放的是JSON
格式的数据。body
中可以放任意格式的数据,前端和后端约定好即可,JSON
是非常常用的格式 - 密码是
base64
编码
[!quote]
base64
编码
- 末尾带有“
==
“,使用四个字节,对原始数据中的三个字节进行重新编码- 这种编码方式主要是为了能够去掉原始数据中的二进制内容
base64
具体的编码规则,有标准版,也有自定义版
- 标准版,怎么编码、解码都是透明的,无法作为加密的方案
- 自定义版,自己约定编码规则,别人不知道,此时就可以作为一种简单的加密手段
- 目前仍然有一部分网站,密码是明文传输(码云去年的时候还是明文传输),黑客稍微抓个包就知道了
上传
Gitee
上更改头像操作
body
部分就是图片的内容,图片本身是二进制的,此处是对二进制的图片数据进行了base64
编码(很长很长的数据)
GET 和 POST 有什么区别(面试)
先盖棺定论:GET
和 POST
本质上没有区别
- 使用
GET
和POST
的场景可以相互替换(取决于代码是怎么写的,尤其是在服务器和客户端都是自己实现的情况下) - 部分服务器/部分浏览器,某些情况下
GET
和POST
不能完美替换 - 但是大部分情况下相互替换问题一般不大
区别
但是 GET
和 POST
在使用习惯上还是有区别的
GET
习惯于把数据放到URL
的query string
中;POST
习惯于把数据放到body
中
- 但
GET
也可以把数据放到body
中。有的服务器/浏览器可能不支持 POST
也可以把数据放到query string
中。对于绝大部分的服务器和浏览器都适用
- 语义的区别
- 标准文档中,GET 的语义是用来获取数据;POST 的语义是给服务器传输数据
- 实际使用并不一定非得拘泥于上述要求
- 关于幂等性
- 每次输入的内容一定,输出的结果也一定,称为幂等;每次输入的内容一定,输出的结果不一定,就不是幂等
- 计算机中,幂等也是挺关键的。如果某个操作本身是幂等的,此时就可以进行缓存了
- 标准文档中,建议
GET
请求实现成幂等的;POST
则无要求
GET
在实际开发中也不一定非得实现成幂等。标准是这么建议的,但不一定采纳。确实很多时候是按照幂等的方式走的
GET
请求是可以被浏览器收藏夹收藏的,而POST
不可以
不准确的说法
网上有些相关的资料,说法不太准确
POST
比GET
更安全
论据: 登录的时候,如果使用 GET
,用户名密码就会显示在 URL
上,此时就会被别人直接使用,所以就不安全
论证: 即使是 POST
,数据没有显示在 URL
,也是可以被黑客通过抓包获取的。真正保证安全性的关键在于加密,如果数据加密了,就算放到 URL
上显示,又能怎样呢?
GET
传输的数据量小(存在上限);POST
传输的数据量更大
论据: 描述的是以前,老版本的 IE
浏览器在实现的时候,URL
的长度有限制(历史了)
论证: 实际上 HTTP
标准文档上明确说了,对于 GET
URL
的长度不做限制。目前比较长的 URL
也是很常见的
GET
只能携带文本数据;POST
则可以携带二进制数据
这个说法不能说是完全错误,但确实有一定的局限性
URL
通过 query string
来携带数据,query string
是只能包含文本的,但是可以对二进制数据进行 URL encode
,之后自然就成了文本了。到了服务器自然进行 URL decode
就能把数据还原成二进制
POST
请求 body
中也经常不是直接携带二进制(可以),也有很多时候是对二进制数据进行 URL encode
/ / base64
等方式进行转码