什么时候使用POST,什么时候使用GET?

从我能收集到的,有三类:

  1. 切勿使用GET并使用POST
  2. 切勿使用POST并使用GET
  3. 你使用哪一个并不重要。

假设这三种情况我是否正确? 如果是这样的话,每个案例都有哪些例子呢?

使用POST进行破坏性操作,例如创build(我意识到讽刺),编辑和删除,因为您无法在浏览器的地址栏中执行POST操作。 在安全的情况下使用GET可以让一个人调用一个动作。 所以一个URL如下所示:

 http://myblog.org/admin/posts/delete/357 

应该带你到一个确认页面,而不是简单地删除该项目。 以这种方式避免事故要容易得多。

POSTGET更安全,因为您不会将信息粘贴到URL中。 所以使用GET作为收集密码或其他敏感信息的HTML表单的method并不是最好的主意。

最后一个注意事项: POST可以传输比GET更多的信息。 我不记得每个的确切约束,但优势是显着的。

简单来说

  • 使用GET进行safe and idempotent请求
  • 使用POST neither safe nor idempotent请求

详情有一个适当的地方为每个。 即使您不遵循RESTful原则,也可以通过了解REST以及如何使用面向资源的方法来获取更多信息。

REST风格的应用程序将use GETs来进行既safe and idempotent

safe操作是not change the data请求not change the data的操作。

一个idempotent操作就是无论你多less次请求结果be the same

理所当然的是,由于GETs被用于安全的操作,它们自动也是幂等的 。 通常,GET用于检索资源(例如,问题及其相关的堆栈溢出答案)或资源集合。

REST风格的应用程序将使用PUTs来执行not safe but idempotent

我知道这个问题是关于GET和POST的,但是我会在一秒之内回到POST。

通常使用PUT编辑资源(例如编辑一个问题或堆栈溢出的答案)。

一个POST将被用于任何neither safe or idempotent

通常一个POST会被用来创build一个新的资源,例如创build一个新的SO问题(尽pipe在某些devise中也会使用PUT)。

如果你运行两次POST,你最终会创build两个新的问题。

还有一个DELETE操作,但我猜我可以离开那里:)

讨论

实际上,现代的网页浏览器通常只支持GET和POST(你可以通过javascript调用来执行所有这些操作,但是在表单中input数据和按提交的时候通常有两个选项)。 在一个RESTful应用程序中,POST通常会被重写以提供PUT和DELETE调用。

但是,即使您没有遵循RESTful原则,在使用GET来检索/查看信息和POST来创build/编辑信息方面也是有用的。

你不应该使用GET来改变数据的操作。 如果一个search引擎抓取一个链接到你的恶作剧,或客户端书签,它可以拼出很大的麻烦。

如果您不介意重复请求,请使用GET(即不改变状态)。

如果操作确实改变了系统的状态,请使用POST。

短版

GET:通常用于提交的search请求,或任何您希望用户能够再次拉起确切页面的请求。

GET的优点:

  • url可以安全地书签。
  • 页面可以安全地重新加载。

GET的缺点:

  • variables通过url作为名称 – 值对传递。 (安全风险)
  • 有限数量的可以传递的variables。 (基于浏览器,例如, Internet Explorer限制为2,048个字符)。

POST:用于数据可能用于更改数据库的较高安全性请求,或者不希望某人书签的页面。

POST的优点:

  • 名称 – 值对不会显示在url中。 (安全+ = 1)
  • 无限数量的名称 – 值对可以通过POST传递。 参考。

POST的缺点:

  • 使用POST数据的页面不能为书签。 (如果你愿意的话)

更长的版本

直接来自超文本传输​​协议 – HTTP / 1.1 :

9.3 GET

GET方法意味着检索任何信息(以实体的forms)由Request-URI标识。 如果Request-URI指的是一个数据产生过程,那么产生的数据应该作为响应中的实体而不是过程的源文本被返回,除非该文本恰好是过程的输出。

如果请求消息包含If-Modified-Since,If-Unmodified-Since,If-Match,If-None-Match或If-Range标题字段,则GET方法的语义变为“条件GET”。 一个有条件的GET方法请求仅在条件头字段描述的情况下传送实体。 条件GET方法旨在通过允许caching实体刷新而不需要多个请求或传送客户端已经拥有的数据来减less不必要的networking使用。

如果请求消息包含Range标头字段,则GET方法的语义变为“部分GET”。 部分GET请求只有部分实体被转移,如14.35节所述。 部分GET方法旨在通过允许完成部分检索的实体而不传送已经由客户端持有的数据来减less不必要的networking使用。

对GET请求的响应是可caching的,当且仅当它符合第13节中描述的HTTPcaching的要求。

用于表单的安全性考虑见15.1.3节。

9.5 POST

POST方法用于请求源服务器接受请求中包含的实体作为Request-Line中Request-URI标识的资源的新下属。 POST被devise为允许统一的方法来覆盖以下function:

  • 诠释现有资源;

  • 向公告栏,新闻组,邮件列表或类似的文章组发布信息;

  • 向数据处理过程提供一组数据,例如提交表单的结果;

  • 通过追加操作扩展数据库。

POST方法执行的实际function由服务器决定,通常取决于Request-URI。 所发布的实体从属于该URI,其方式与文件从属于包含它的目录相同,新闻文章从属于发布的新闻组,或者logging从属于数据库。

POST方法执行的操作可能不会导致可以通过URI标识的资源。 在这种情况下,根据响应是否包含描述结果的实体,200(OK)或204(无内容)是适当的响应状态。

第一个重要的是GET和POST的含义

  • GET应该用来… 服务器获取一些信息,
  • 而POST应该用来发送一些信息服务器。

之后,可以注意一些事情:

  • 使用GET,您的用户可以使用浏览器中的“返回”button,并且可以书签页面
  • 作为GET可以传递的参数的大小是有限制的(如果我没有弄错的话,某些版本的Internet Explorer是2KB) ; POST的限制更多,一般取决于服务器的configuration。

无论如何,我不认为我们可以在没有GET的情况下“活着”:想一想每天在查询string中使用参数的URL数量 – 没有GET,所有这些都不起作用;-)

除了许多网页浏览器的长度限制差异外,还存在语义上的差异。 GET应该是“安全的”,因为它们是不改变服务器状态的只读操作。 POST通常会改变状态,并会在重新提交时发出警告。 search引擎的networking爬虫可能会做GET,但不应该做POST。

如果要在不更改状态的情况下读取数据,请使用GET;如果要更新服务器上的状态,请使用POST。

我的一般经验法则是,当您向服务器发出不会改变状态的请求时,使用Get。 post保留用于请求改变状态的服务器。

一个实际的区别是浏览器和Web服务器对URL中可以存在的字符数量有限制。 这与应用程序到应用程序是不同的,但是如果你的表单中有textarea ,它肯定是可能的。

GET的另一个问题 – 他们被search引擎和其他自动系统索引。 谷歌曾经有一个产品,可以预览您正在查看的网页上的链接,所以如果您点击这些链接,他们会更快加载。 它在有像delete.php?id=1这样的链接的网站上造成严重的破坏 – 人们丢失了整个网站。

如果您希望URL反映页面的状态,请使用GET。 这对查看dynamic生成的页面非常有用,例如这里所看到的页面。 应该在表单中使用POST提交数据,就像我点击“发布答案”button时一样。 它还会生成一个更干净的URL,因为它不会在path之后生成参数string。

由于GETs纯粹是URL,它们可以通过网页浏览器进行caching,并可能更好地用于像一贯生成的图像。 (设置到期时间)

来自gravatar页面的一个例子: http : //www.gravatar.com/avatar/4c3be63a4c2f539b013787725dfce802? d=monsterid

GET可能会稍微提高性能,一些Web服务器在调用处理程序之前将POST内容写入临时文件。

另一件要考虑的是尺寸限制。 尽pipe浏览器可能支持更多,GET的上限是1024个字节的URL大小。

传输更多的数据应该使用POST来获得更好的浏览器兼容性。

甚至比这个限制还要小是一个问题,正如另一张海报所写的,URL中的任何内容都可能在浏览器的用户界面的其他部分,比如历史。

没有什么是你无法做到的。 重点是你不应该修改HTTP GET的服务器状态。 HTTP代理假设由于HTTP GET不修改状态,所以用户调用HTTP GET一次还是1000次都没有区别。 使用这些信息,他们认为返回第一个HTTP GET的caching版本是安全的。 如果你打破了HTTP规范,你可能会冒险破坏HTTP客户端和代理服务器。 不要这样做:)

这遍历了REST的概念,以及Web如何被使用。 软件工程收音机上有一个非常好的播客 ,深入讨论了使用Get和Post的情况。

获取用于从服务器提取数据,不需要更新操作。 这个想法是,你应该能够反复使用相同的GET请求,并返回相同的信息。 该URL在查询string中有获取信息,因为它的目的是能够很容易地发送到其他系统和人们喜欢的地址在哪里可以find的东西。

应该使用Post(至less通过Web所基于的REST体系结构)将信息推送到服务器/告诉服务器执行操作。 例如:更新这个数据,创build这个logging。

1.3selectHTTP GETPOST快速检查表

使用GET如果:

  The interaction is more like a question (ie, it is a safe operation such as a query, read operation, or lookup). 

使用POST如果:

  The interaction is more like an order, or The interaction changes the state of the resource in a way that the user would perceive (eg, a subscription to a service), or The user be held accountable for the results of the interaction. 

来源 。

我没有看到使用得到的问题,虽然我使用它的简单的东西,这是有意义的,保持在查询string的东西。

使用它来更新状态 – 像delete.php?id=5的GET来删除页面 – 是非常危险的。 人们发现,当Google的networking加速器开始在网页上预取url时,它会触发所有的“删除”链接,并剔除人们的数据。 search引擎蜘蛛也可能发生同样的事情。

POST可以移动大数据而GET不能。

但一般来说,这不是关于GET的一个缺点,而是一个约定,如果你想让你的网站/ webappperformance的很好。

看看http://www.w3.org/2001/tag/doc/whenToUseGet.html

从RFC 2616 :

9.3 GET
GET方法意味着检索任何信息(以实体的forms)由Request-URI标识。 如果Request-URI指的是一个数据产生过程,那么产生的数据应该作为响应中的实体而不是过程的源文本被返回,除非该文本恰好是过程的输出。

9.5 POST
POST方法用于请求源服务器接受请求中包含的实体作为Request-Line中Request-URI标识的资源的新下属。 POST被devise为允许统一的方法来覆盖以下function:

  • 诠释现有资源;
  • 向公告栏,新闻组,邮件列表或类似的文章组发布信息;
  • 向数据处理过程提供一组数据,例如提交表单的结果;
  • 通过追加操作扩展数据库。

POST方法执行的实际function由服务器决定,通常取决于Request-URI。 所发布的实体从属于该URI,其方式与文件从属于包含它的目录相同,新闻文章从属于发布的新闻组,或者logging从属于数据库。

POST方法执行的操作可能不会导致可以通过URI标识的资源。 在这种情况下,根据响应是否包含描述结果的实体,200(OK)或204(无内容)是适当的响应状态。

最初的意图是GET被用于获取数据,POST是任何东西。 我使用的经验法则是,如果我将任何东西发送回服务器,我使用POST。 如果我只是调用一个URL来获取数据,我使用GET。

阅读维基百科关于HTTP的文章 。 它将解释协议是什么,它做了什么:

得到

请求指定的资源的表示。 请注意,不应将GET用于导致副作用的操作,例如将其用于在Web应用程序中执行操作。 其中一个原因是GET可能被机器人或抓取工具任意使用,不需要考虑请求应该引起的副作用。

POST提交要处理的数据(例如,从HTML表单)到已标识的资源。 数据包含在请求的正文中。 这可能会导致新资源的创build或现有资源的更新,或两者的结果。

W3C有一个名为URIs,Addressability的文档,并且使用HTTP GET和POST来解释何时使用什么。 引用

1.3selectHTTP GET或POST的快速检查表

  • 使用GET如果:
    • 交互更像是一个问题(例如,查询,读取操作或查找等安全操作)。

  • 使用POST如果:
    • 交互更像是一个命令,或者
    • 交互以用户可以感知的方式(例如对服务的订阅)改变资源的状态,或者○用户对交互的结果负责。

但是,在最终决定使用HTTP GET或POST之前,还请考虑敏感数据和实际考虑因素。

每当你提交一个HTML表单时,就会有一个实际的例子。 您指定post获取表单操作。 PHP会相应地填充$ _GET和$ _POST。

在PHP中, POST数据限制通常由您的php.ini设置。 我相信服务器/浏览器设置限制GET – 通常约255字节。

简单版本的POST GET PUT DELETE使用GET – 当你想获得像任何ID或名称的数据列表任何资源使用POST – 当你想发送任何数据到服务器。 请记住,POST是重量级的操作,因为更新我们应该使用PUT而不是POST内部POST将创build新的资源使用PUT – 当你

从w3schools.com :

什么是HTTP?

超文本传输​​协议(HTTP)旨在实现客户端和服务器之间的通信。

HTTP作为客户端和服务器之间的请求 – 响应协议。

网页浏览器可以是客户端,并且承载网站的计算机上的应用程序可以是服务器。

示例:客户端(浏览器)向服务器提交HTTP请求; 那么服务器会向客户端返回一个响应。 响应包含有关请求的状态信息,也可能包含请求的内容。

两种HTTP请求方法:GET和POST

在客户端和服务器之间的两个常用的请求 – 响应方法是:GET和POST。

GET – 从指定资源请求数据POST – 将要处理的数据提交给指定的资源

这里我们区分主要区别:

在这里输入图像描述

GET和POST基本上允许信息从浏览器(或其他HTTP客户端)发送回Web服务器。

设想一下,你在HTML页面上有一个表单,点击“submit”button将表单中的数据作为“name = value”对发送回服务器。

selectGET作为“方法”会将所有数据附加到URL中,并且会显示在浏览器的URL栏中。 您可以使用GET发回的信息量受到限制,因为URL只能包含1024个字符。

云集成面临的挑战立即下载POST(另一方面)将(通常)通过套接字将信息发送回networking服务器,并且不会显示在URL栏中。 您可以通过这种方式将更多的信息发送到服务器,而且也不限于文本数据。 可以发送文件甚至二进制数据,例如序列化的Java对象!

那么一件重要的事情就是你通过GET提交的东西将通过URL公开。 其次,Ceejayoz说,URL的字符是有限的。

HTTP Post数据没有对数据量的限制,因为不同的浏览器对GET有不同的限制。 RFC 2068指出:

服务器应该谨慎地依赖于长度超过255字节的URI长度,因为一些较旧的客户端或代理实现可能不能正确支持这些长度

具体来说,你应该正确的HTTP构造他们用于什么。 HTTP GET不应该有副作用,可以安全地刷新和存储HTTP代理等。

当您想要针对url资源提交数据时使用HTTP POST。

使用HTTP GET的典型示例在search上,即search?查询=我的+查询使用HTTP POST的典型示例是将反馈提交给在线表单。

另一个区别是POST通常需要两个HTTP操作,而GET只需要一个。

编辑:我应该澄清 – 对于常见的编程模式。 通常用一个直接的HTML网页来回应POST是一个值得怀疑的devise,其中一个原因是令人讨厌的“你必须重新提交这个表单,你希望这么做吗? 按下后退button。

正如其他人所回答的那样,获取的URL大小是有限制的,文件只能以邮递方式提交。

我想补充一点, 可以添加一个get的数据库的东西,并执行一个职位的行动。 当一个脚本收到一个post或一个get,它可以做任何作者想要它做的事情。 我相信缺乏理解来自于这本书的select或者你如何阅读。

脚本作者应该使用post来更改数据库,并使用get仅用于检索信息。

脚本语言提供了许多访问请求的方法。 例如,PHP允许使用$_REQUEST来检索post或get。 应该避免使用更具体的$_GET$_POST

在networking编程方面,还有更多的解释空间。 人们该做什么,能做什么,哪个更好,往往是争论。 幸运的是,在这种情况下,没有歧义。 您应该使用post来更改数据,并且您应该使用get来检索信息。

Gorgapor, mod_rewrite经常使用GET 。 它只是允许将一个友好的URL转换成一个GET查询string的URL。

当我不希望人们看到QueryString或QueryString变大时,我使用POST。 另外,file upload需要POST。

我没有看到使用GET的问题,我用它来保存QueryString上的东西。

使用GET将允许链接到一个特定的页面也可能在POST不起作用。