Get和Post的区别与用法

突如其来的视频面试让我措手不及,努力在脑海中搜寻尘封的知识却一无所获,所以复习后将它记录下来,希望能够帮助到阅读这篇博客的你们。

首先是大家最熟悉的,也就是W3School给出的“答案”:

GET

请注意,查询字符串(名称/值对)是在GET请求的URL中发送的:

/test/demo_form.php?name1=value1&name2=value2

  • GET请求可以被缓存
  • GET请求保留在浏览器历史记录中
  • GET请求可以加书签
  • 处理敏感数据时,切勿使用GET请求
  • GET请求有长度限制
  • GET请求仅用于请求数据(不修改)

POST

POST用于将数据发送到服务器以创建/更新资源。

通过POST发送到服务器的数据存储在HTTP请求的请求主体中

POST /test/demo_form.php HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

  • POST请求永远不会被缓存
  • POST请求不会保留在浏览器历史记录中
  • POST请求无法添加书签
  • POST请求对数据长度没有限制

这份来自W3School的标准答案,详细阐述了二者的区别,但是这还不够。

首先我们需要学习一个术语,叫做“幂等(idempotent)”,如果我们说一个HTTP方法是幂等的,意思是同样的请求被执行一次与连续执行多次的效果是一样的,换句话说,幂等方法不应该具有副作用。在正确实现的条件下GET,HEAD,PUT,DELETE等方法都是幂等的,而POST方法不是。所有的safe方法也都是幂等的。

幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同。例如,第一次调用DELETE方法有可能返回200,但是后续的请求可能会返回404,DELETE的言外之意是,开发者不应该使用DELETE方法实现具有删除最后条目功能的 RESTful API。


GET /pageX HTTP/1.1是幂等的。连续调用多次,客户端接收到的结果都是一样的:

GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   

POST /add_row HTTP/1.1不是幂等的。如果调用多次,就会增加多行记录:

POST /add_row HTTP/1.1
POST /add_row HTTP/1.1   -> Adds a 2nd row
POST /add_row HTTP/1.1   -> Adds a 3rd row

DELETE /idX/delete HTTP/1.1是幂等的,即便是不同请求之间接收到的状态码不一样:

DELETE /idX/delete HTTP/1.1   -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1   -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1   -> Returns 404


所以并不是POST和GET哪个更安全的问题,它们的用处就是不同的:

GET用于查看某些内容而不进行更改,或者说用于检索远程数据,请求指定的资源

POST用于更改某些内容,即提交处理数据给标识的资源

例如,搜索页面应使用GET,而更改密码的表单应使用POST。


在HTTP/1.1规范(RFC 2616)第15节安全注意事项(Security Considerations)中解释了为什么只应使用GET来检索数据:

Authors of services which use the HTTP protocol SHOULD NOT use GET based forms for the submission of sensitive data, because this will cause this data to be encoded in the Request-URI. Many existing servers, proxies, and user agents will log the request URI in someplace where it might be visible to third parties. Servers can use POST-based form submission instead

 大致意思如下:使用HTTP协议的作者不应使用GET提交敏感数据,因为这将导致数据被编码在请求URI中。许多现有的服务器、代理、和用户代理将在第三方的一些地方可以看到。服务器可以改用基于POST的表单提交。


在PHP中,二者的概念有些混乱。POST请求从查询字符串以及通过请求正文获取输入。 GET请求仅从查询字符串获取输入。因此,我们可以说POST请求是GET请求的超集。您可以在POST请求中使用$ _GET,甚至在$ _POST和$ _GET中使用具有相同名称的参数甚至意味着不同的含义,甚至可能是有意义的。

例如,假设您有一个用于编辑文章的表单,标题ID可能在查询字符串中,使用$ _GET ['id']获得,但是假设您要更改标题ID。新的ID会出现在请求正文中:$_POST['id']。


最后还有非常重要的一点,在将GET方法应用于AJAX请求时,一些浏览器会缓存请求的结果,尤其是IE浏览器。因此,如果您使用相同的GET请求进行轮询,则即使要查询的数据在服务器端更新了,也将始终返回相同的结果。缓解此问题的一种方法是,通过附加时间戳使每个请求的URL唯一。

我们可以使用如下代码进行实现:

var timestamp = new Date().getTime();
url = url + '?t=' + timestamp;

在我的毕业设计中就被这个问题所困扰,但我并没有意识到这是由于GET方法的幂等特性造成的,通过这次复习,我学会了遗忘的知识,也获得了新的知识。


这篇博文更像是一篇笔记了,结构有点乱,比较随心所欲,希望能够帮助到阅读到这篇博文的你,如果你喜欢这篇博文,还请给个赞或者一键三连,谢谢支持!

 

 

 

参考目录:

StackOverflow:What is the difference between POST and GET? [duplicate]

StackOverflow:When should I use GET or POST method? What's the difference between them?

W3C:Protocol -- HTTP/1.1 RFC 2616:15 Security Considerations

W3School:HTTP Request Methods

php.net:$_POST

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值