HTTP中GET和POST

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是什么?_一台机器调用另一台机器的结果-优快云博客RPC规范&接口实现模块Flask-JSONRPC_c# jsonrpc 规范-优快云博客

HTTP协议中GET请求POST请求在多个方面存在显著差异: 1. **定义与设计目的**:GET请求用于从服务器获取资源,不应对服务器资源产生修改,是“安全且幂等”的,典型场景有网页加载、数据查询、静态资源请求;POST请求用于向服务器提交数据,可能创建或修改资源,是“非幂等且有副作用”的,典型场景包括表单提交、文件上传、敏感操作(如登录、支付)[^3]。 2. **数据传输方式**:GET请求的参数附加在URL后,以查询字符串形式呈现,参数暴露于URL中,易被缓存日志记录,例如`https://api.com?name=value`;POST请求的参数封装在请求体中,不可见,如请求体为`{ "name": "value" }` [^3]。 3. **安全性**:GET请求的数据参数暴露在URL中,安全性较低,像密码等不能暴露的信息不能使用GET请求;POST请求的请求信息放在请求头,安全性较高 [^2]。 4. **数据长度限制**:GET提交有数据大小的限制,一般不超过2KB;POST理论上默认没有限制 [^2]。 5. **缓存行为**:GET请求通常会被浏览器缓存,而POST请求一般不会被缓存。 6. **幂等性**:GET请求是幂等的,多次执行相同的GET请求,结果是相同的,不会对服务器资源产生额外影响;POST请求是非幂等的,多次执行相同的POST请求可能会对服务器资源产生不同的影响,如多次提交表单可能会多次创建资源 [^3]。 ```python # 以下是一个简单的Python示例,使用requests库分别发送GETPOST请求 import requests # 发送GET请求 get_url = 'https://example.com/api/data?id=123' get_response = requests.get(get_url) print('GET请求响应状态码:', get_response.status_code) # 发送POST请求 post_url = 'https://example.com/api/submit' data = {'name': 'John', 'age': 30} post_response = requests.post(post_url, json=data) print('POST请求响应状态码:', post_response.status_code) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值