根据我的收集,有三类:
切勿使用GET
和使用POST
切勿使用POST
和使用GET
你使用哪一个并不重要.
假设这三个案件我是否正确?如果是这样,每个案例的一些例子是什么?
使用POST
破坏性行动,如创建(我知道的讽刺),编辑和删除,因为你不能打了一个POST
在浏览器的地址栏中行动.使用GET
时,它是安全的,让一个人打电话的动作.所以一个URL如:
http://myblog.org/admin/posts/delete/357
应该带您到确认页面,而不是简单地删除该项目.以这种方式避免事故要容易得多.
POST
也比GET
您更安全,因为您没有将信息粘贴到URL中.因此使用GET
的method
用于收集密码或其他敏感信息的HTML表单是不是最好的主意.
最后一点说明:POST
可以传输更多的信息GET
.'POST'对传输的数据没有大小限制,而'GET'限制为2048个字符.
简单来说
使用GET
的safe and
请求
使用idempotent
的POST
请求
详细信息 每个人都有一个合适的地方.即使您不遵循RESTful原则,也可以从学习REST以及面向资源的方法如何工作中获得很多.
RESTful应用程序将
neither safe nor idempotent
用于两者的操作use GETs
.
一个safe and idempotent
操作是超出的操作safe
要求.
not change the data
操作是一种操作,idempotent
无论您请求多少次,结果都将是一次操作.
按理说,由于GET用于安全操作,它们自动也是幂等的.通常,GET用于检索资源(例如,关于堆栈溢出的问题及其相关答案)或资源集合.
RESTful应用程序将
be the same
用于操作PUTs
.
我知道问题是关于GET和POST,但我会在一秒钟内回到POST.
通常,PUT用于编辑资源(例如,编辑问题或堆栈溢出的答案).
A
not safe but idempotent
将用于任何操作POST
.
通常,POST将用于创建新资源,例如创建NEW SO问题(尽管在某些设计中也会使用PUT).
如果你运行两次POST,最终会产生两个新问题.
还有一个DELETE操作,但我猜我可以留下那里:)
讨论
实际上,现代Web浏览器通常只能可靠地支持GET和POST(您可以通过javascript调用执行所有这些操作,但就在表单中输入数据和按提交而言,您通常有两个选项).在RESTful应用程序中,POST通常会被覆盖以提供PUT和DELETE调用.
但是,即使您没有遵循RESTful原则,考虑使用GET检索/查看信息和POST来创建/编辑信息也很有用.
永远不要将GET用于改变数据的操作.如果搜索引擎抓取指向您的恶意操作的链接,或者客户端书签,则可能会遇到大麻烦.
如果您不介意重复请求(即它不会改变状态),请使用GET.
如果操作确实改变了系统的状态,请使用POST.
GET:通常用于提交的搜索请求,或者您希望用户能够再次提取确切页面的任何请求.
GET的优点:
可以安全地为URL添加书签.
页面可以安全重新加载.
GET的缺点:
变量作为名称 - 值对传递给url.(安全风险)
可以传递的变量数量有限.(基于浏览器.例如,Internet Explorer限制为2,048个字符.)
POST:用于更高安全性请求,其中数据可用于更改数据库,或用于不希望某人加入书签的页面.
POST的优点:
名称 - 值对不会显示在url中.(安全+ = 1)
可以通过POST传递无限数量的名称 - 值对.参考.
POST的缺点:
使用POST数据的页面无法添加书签.(如果你愿意的话.)
直接来自超文本传输协议 - HTTP/1.1:
9.3 GET
GET方法意味着检索由Request-URI标识的任何信息(以实体的形式).如果Request-URI引用数据生成过程,则生成的数据应作为响应中的实体而不是过程的源文本返回,除非该文本恰好是过程的输出.
如果请求消息包括If-Modified-Since,If-Unmodified-Since,If-Match,If-None-Match或If-Range头字段,则GET方法的语义变为"条件GET".条件GET方法请求仅在条件头字段描述的情况下传送实体.条件GET方法旨在通过允许刷新缓存的实体而不需要多个请求或传输客户端已经拥有的数据来减少不必要的网络使用.
如果请求消息包括Range头字段,则GET方法的语义变为"部分GET".部分GET请求仅传输实体的一部分,如第14.35节所述.部分GET方法旨在通过允许完成部分检索的实体而不传输客户端已经拥有的数据来减少不必要的网络使用.
当且仅当它满足第13节中描述的HTTP缓存要求时,对GET请求的响应才是可缓存的.
有关用于表单的安全注意事项,请参见第15.1.3节.
9.5 POST
POST方法用于请求源服务器接受请求中包含的实体作为Request-URI中Request-URI标识的资源的新下级.POST旨在允许统一的方法来涵盖以下功能:
现有资源的注释;
在公告栏,新闻组,邮件列表或类似文章组中发布消息;
提供数据块,例如提交表单的结果,数据处理过程;
通过追加操作扩展数据库.
POST方法执行的实际功能由服务器确定,通常依赖于Request-URI.发布的实体从属于该URI,其方式与文件从属于包含它的目录相同,新闻文章从属于发布它的新闻组,或者记录从属于数据库.
POST方法执行的操作可能不会生成可由URI标识的资源.在这种情况下,200(OK)或204(No Content)是适当的响应状态,具体取决于响应是否包括描述结果的实体.
第一个重要的是GET与POST 的含义:
应该使用GET来获取... 来自服务器的一些信息,
而POST应该被用来发送一些信息到服务器.
在那之后,可以注意到以下几点:
使用GET,您的用户可以在浏览器中使用"后退"按钮,他们可以为页面添加书签
您可以作为GET传递的参数大小有限制(对于某些版本的Internet Explorer,如果我没有记错的话,则为2KB) ; POST的限制更多,通常取决于服务器的配置.
无论如何,我认为没有GET我们就不能"活着":想想你每天使用参数在查询字符串中使用了多少个URL - 没有GET,所有这些都不起作用;-)
除了许多Web浏览器中的长度约束差异之外,还存在语义差异.GET应该是"安全的",因为它们是不改变服务器状态的只读操作.POST通常会更改状态,并会在重新提交时发出警告.搜索引擎的网络抓取工具可能会进行GET但不应该进行POST.
如果要在不更改状态的情况下读取数据,请使用GET;如果要更新服务器上的状态,请使用POST.
我的一般经验法则是当您向服务器发出不会改变状态的请求时使用Get.帖子保留用于改变状态的服务器的请求.
一个实际的区别是浏览器和Web服务器对URL中可以存在的字符数有限制.它从应用程序到应用程序是不同的,但如果你textarea
的表单中有它,那肯定可以点击它.
另一个与GET相关的问题 - 它们被搜索引擎和其他自动系统索引.Google曾经有一款产品可以预览您正在查看的页面上的链接,因此如果您点击这些链接,它们的加载速度会更快.它对那些有链接的网站造成了严重破坏delete.php?id=1
- 人们丢失了整个网站.
如果希望URL反映页面状态,请使用GET.这对于查看动态生成的页面非常有用,例如此处显示的页面.应该在表单中使用POST来提交数据,例如当我单击"发布您的答案"按钮时.它还会生成一个更干净的URL,因为它不会在路径后生成参数字符串.
因为GET是纯粹的URL,所以它们可以通过Web浏览器进行缓存,并且可以更好地用于诸如一致生成的图像之类的内容.(设定到期时间)
来自gravatar页面的一个例子:http://www.gravatar.com/avatar/4c3be63a4c2f539b013787725dfce802? d = bulletterid
GET可能会稍微提高性能,一些Web服务器在调用处理程序之前将POST内容写入临时文件.
另一件需要考虑的是尺寸限制.GET受URL大小的限制,标准为1024字节,但浏览器可能支持更多.
传输更多数据应该使用POST来获得更好的浏览器兼容性.
甚至低于这个限制也是一个问题,正如另一张海报所写的那样,URL中的任何内容都可能最终出现在浏览器UI的其他部分,如历史.