这是我参与「第三届青训营 -后端场」笔记创作活动的第6篇笔记
设计接口的时候发现只使用到了 GET 方法和 POST 方法。所以我就自己重新总结了一下这两个方法的一些区别。
一、GET 方法和 POST 方法分别有什么作用?
GET 方法用于获取资源,而 POST 方法用于传输实体主体。
二、参数上的区别
GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)查看。
因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码。例如 中文 会转换为 %E4%B8%AD%E6%96%87,而空格会转换为 %20。POST 参数支持标准字符集。
GET /test/login?name1=value1&name2=value2 HTTP/1.1
POST /test/demo_form.asp HTTP/1.1
Host: xxx.com
name1=value1&name2=value2
三、安全问题
安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。
GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。
安全的方法除了 GET 之外还有:HEAD、OPTIONS。
不安全的方法除了 POST 之外还有 PUT、DELETE。
四、幂等性
幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。
所有的安全方法也都是幂等的。
在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。
五、是否可以缓存
如果要对响应进行缓存,需要满足以下条件:
- 请求报文的 HTTP 方法本身是可缓存的,包括 GET 和 HEAD,但是 PUT 和 DELETE 不可缓存,POST 在多数情况下不可缓存的。
- 响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。
- 响应报文的 Cache-Control 首部字段没有指定不进行缓存。
六、总结
通过对 GET 方法和 PUT 方法的比较可以发现,GET 方法常用于用户获取自己的一些已经拥有的信息,它是安全的,对服务器的状态是一种读取状态,而 PUT 方法常用于用户上传一些资源存储在服务器端的一些行为,它对于服务器的状态是有改变的,是一种对服务器状态的改变行为。所以可以这样说,通过 PUT 方法用户可以传输更多的信息给服务器去完成一些更加复杂的操作,而 GET 方法常常是伴随着传输给服务器少量的字段信息,获取对应的回应报文。