GET:
从它的语义出发,GET是从服务器获取指定的资源,资源包括静态文本,页面,图片,视频等。
GET的请求参数一般都在url中,url规定只能支持ASCII,所以GET请求的参数也只允许ASCII字符,而且,浏览器对于url的长度是有限制的,(但注意:HTTP协议本身对URL长度并没有做任何规定)
POST:
从它的语义出发,POST是根据请求符合(报文body)对指定的资源做处理。根据不同的资源类型,其处理方式也会有所不同。POST请求携带的资源数据一般是写在报文body中的,不在URL中,body中的数据可以为任意格式,只要你客户端跟服务端协商好就行,并且,浏览器并不会对body的大小做限制。
因此提出一个疑问?
GET和POST方法都是安全跟幂等的吗?
首先,什么是安全跟幂等?
所谓安全:在HTTP协议中,【安全】是指不会【破坏】服务器上的资源
所谓幂等:执行多次相同的操作,其结果是【相同】的。
GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。
所以,可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),而且在浏览器中 GET 请求可以保存为书签。
POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。
所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签。
做个简要的小结。
GET 的语义是请求获取指定的资源。GET 方法是安全、幂等、可被缓存的。
POST 的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 不安全,不幂等,(大部分实现)不可缓存。
注意, 上面是从 RFC 规范定义的语义来分析的。
但是实际过程中,开发者不一定会按照 RFC 规范定义的语义来实现 GET 和 POST 方法。比如:
- 可以用 GET 方法实现新增或删除数据的请求,这样实现的 GET 方法自然就不是安全和幂等。
- 可以用 POST 方法实现查询数据的请求,这样实现的 POST 方法自然就是安全和幂等
注意:
如果「安全」放入概念是指信息是否会被泄漏的话,虽然 POST 用 body 传输数据,而 GET 用 URL 传输,这样数据会在浏览器地址拦容易看到,但是并不能说 GET 不如 POST 安全的。
因为 HTTP 传输的内容都是明文的,虽然在浏览器地址拦看不到 POST 提交的 body 数据,但是只要抓个包就都能看到了。(只是说从url上看不到post提交的body而已)
所以,要避免传输过程中数据被窃取,就要使用 HTTPS 协议,这样所有 HTTP 的数据都会被加密传输。
上述所说的GET和POST都是基于RFC规范,貌似现在有个RPC规范
那么,何为RPC规范呢?
RPC (Remote Procedure Call, 远程过程调用或者远程服务调用)
RPC是什么?_一台机器调用另一台机器的结果-CSDN博客RPC规范&接口实现模块Flask-JSONRPC_c# jsonrpc 规范-CSDN博客