GET 请求方式
这是我们经常会用到的请求方式,根据 HTTP 规范,GET 用于信息获取,请求指定的资源。
而且应该是安全的和 幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。
还有一点,GET请求是可缓存的,当我们使用GET请求方法时,请求可能会被浏览器缓存。
当发送请求时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符),所以说GET方法不能传过长的数据。而且,GET方法发送的数据只允许 ASCII 字符。
我说ASCII字符你可能不太理解,简单来说,数字,大写字母,小写字母,符号,空格都属于ASCII字符,中文不是。但是为什么我们使用GET请求可以发送中文?
因为GET有自己的编码规则: 如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:
%E4%BD%A0%E5%A5%BD
其中%XX中的XX为该符号以16进制表示的ASCII
POST请求方式
POST用于向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
上面说GET方法时安全的和幂等的,这个安全的我要从另一个方面来反驳它了,GET的安全说的是操作用于获取信息而非修改信息,但是GET方法中的参数时放在URL中的,这样的话很容易暴露信息。
而POST的安全不仅仅是参数不在URL中,发送的请求也不会被保存在浏览器历史记录中。还有就是CSRF,一种网络黑客技术,使用POST可以极大的避免被攻击。
GET和POST的区别
- 从语义上讲:
- GET一般是
获取
数据 - POST一般是
发送和获取
数据
- GET一般是
- TCP数据包的数量不同:
- GET一般产生
一个
TCP数据包,head和data一起发送
- POST一般产生
两个
TCP数据包,header先发送
,服务器响应100ms,然后浏览器继续发送
data,服务器200ms后返回数据
- GET一般产生
- 传输参数放的位置:(核心区别)
- GET传输的参数一般放在
url
后面 - POST传输的参数一般放在
request body
里面
- GET传输的参数一般放在
其实,GET 和 POST 能做的事情是一样的,例如给GET加上request body
,或给POST加上url参数
,技术上完全是行得通的,但为什么我们不会给GET加上request body,给POST加上url参数呢?
打个比方:如果 GET 和 POST 比作两种类型的货车:
- 参数放在 url 后面 就好比 把货物放在货车车顶:容量又小又不安全
- 参数放在 request body 里面 就好比 把货物放在车厢里面:容量大又安全
POST 不在 url 后面加参数 是因为:参数加在url上不安全且容量小,有request body
又安全容量又大
不用白不用。这就好比一辆货车运货,你货物不放在车里非要放在车顶,这很不安全也很“傻”
GET 不在 request body 里面传参 是因为:数据量太大对浏览器和服务器都是
很大负担
,如果使用GET 服务并在request body偷偷藏了数据的情况下,服务器一看到是 GET 方式就会认为这次的货物量应该很少,所以有些服务器会直接忽略
这些数据。所以为了数据稳妥
,也为了浏览器和服务器的性能
着想,我们一般不会这么做
- 传输数据量的不同:
- 大多数服务器虽然说最多可以处理
64K
大小的url,但大多数浏览器通常都会限制url长度在2K
个字节,这也说明了 GET 传输的参数大小一般是2K
左右 - POST传输数据量理论上是
无限
的,但各服务器会对其进行限制
,具体大小看服务器的设置
- 大多数服务器虽然说最多可以处理
上面说到的安全性差异,即
- 传输数据的安全性:
- GET 传输的参数
不安全
- POST 传输的参数一般来讲
比较安全
- GET 传输的参数
这个安全问题实际上就是指
另外,POST 请求方式相比于 GET 的安全性还体现在:
- 是否缓存:
- GET 请求获得的数据一般可以缓存下来
- POST 请求获得的数据一般不可以缓存下来
- 历史记录问题:
- GET 请求
回退无差
,也就是说发送的请求会被保存在浏览器历史记录中 - POST 请求回退
会重新请求
,也就是说发送的请求不会被保存在浏览器历史记录中
- GET 请求
PUT 请求方式
PUT 请求方法使用请求中的负载创建或者替换目标资源。
简单的来说,PUT用于向服务器发送请求,如果URI不存在,则要求服务器根据请求创建资源,如果存在,服务器就接受请求内容,并修改URI资源的原始版本。
在我们平常开发的时候也会用到PUT,使用起来和POST差不多
,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置
,而POST则没有,POST的数据存放位置由服务器自己决定
DELETE 请求方式
DELETE 请求方法用于删除指定的资源
。
DELETE是一个很朴素的方法,没有请求正文,没有返回主体,也不会缓存,很单纯的告诉你我不需要它了,我要删了它,你只要告诉我删没删成功就行
。
如果 DELETE 方法成功执行,那么可能会有以下几种状态码:
- 状态码 200 (OK) 表示操作已执行,并且响应中提供了相关状态的描述信息
- 状态码 202 (Accepted) 表示请求的操作可能会成功执行,但是尚未开始执行。
- 状态码 204 (No Content) 表示操作已执行,但是无进一步的相关信息。