关于 Get 和 Post 的总结
Feb 25, 2022
# Net
安全是指请求方法不会破坏服务器上的资源
幂等是指多次执行相同的操作,其结果都是相同的
# 用途和语义
- GET:用于请求服务器发送指定的资源。它应该是安全的和幂等的,意味着单独的GET请求不应该对服务器的资源状态产生副作用。
- POST:用于向服务器提交数据,通常是填充表单数据。POST请求可能会在服务器上创建新的资源或修改现有资源。
# 数据传输
- GET:参数通过URL传输,数据附加到URL后面,通常形式是
?key1=value1&key2=value2
。因此GET请求的参数是可见的,存在长度限制(受浏览器和服务器限制)。 - POST:数据包含在请求体中,对用户不可见,可以传输更多的数据而不受限制。
# 安全性和隐私
- GET:由于参数在URL中,所以不适合传输敏感数据。GET请求的URL可能会被浏览器历史记录、服务器日志、或者缓存记录下来。
- POST:数据不会出现在URL中,提供了更好的隐私保护,适合传输敏感或大量数据。
# 缓存和历史记录
- GET:请求的响应可以被缓存,且GET请求容易被书签保存,也能在浏览器历史中回溯。
- POST:响应通常不被缓存,POST请求不会保存为书签,也不会在浏览器历史中留下直接可回溯的记录。
# 幂等性
- GET:是幂等的,这意味着多次执行同一请求,资源的状态应该是相同的。
- POST:通常是非幂等的,多次执行相同的请求可能会每次都在服务器上创建新资源或者产生其他副作用。
# 使用场景的示例
- GET:搜索请求、读取文章、获取新闻列表等。
- POST:用户登录、上传文件、提交表单数据等。
# 其他请求方法
HTTP协议还定义了其他请求方法,如HEAD、PUT、DELETE、OPTIONS等,每种方法根据需要用于不同场合。
# 总结
在实际应用中,选择GET或POST通常取决于行为(获取数据使用GET,提交数据使用POST)和安全性(敏感数据使用POST)。正确地使用GET和POST请求方法可以帮助遵守HTTP语义,保持Web应用的整洁性和可维护性。
在实际过程中开发者不一定会按照 RFC 规范定义的语义来实现 GET
和 POST
方法
- 可以用
GET
方法实现新增或删除数据的请求,这样实现的GET
方法自然就不是安全和幂等; - 可以用
POST
方法实现查询数据的请求,这样实现的POST
方法自然就是安全和幂等
# 其他
# GET 请求可以带 body 吗?
RFC 规范并没有规定 GET
请求不能带 body。只是因为 RFC 规范定义的 GET
请求是获取资源,所以根据这个语义不需要用到 body。理论上任何 HTTP 请求都可以带 body,任何 HTTP 请求的 URL 也可以携带查询参数。