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

时间:2008-09-05 19:05:12

标签: http-post http-get

根据我的收集,有三类:

  1. 切勿使用GET并使用POST
  2. 切勿使用POST并使用GET
  3. 使用哪一个并不重要。
  4. 我在假设这三个案件时是否正确?如果是这样,每个案例的例子是什么?

27 个答案:

答案 0 :(得分:344)

使用POST进行破坏性操作,例如创建(我知道讽刺),编辑和删除,因为您无法点击浏览器地址栏中的POST操作。如果允许某人呼叫某个操作是安全的,请使用GET。所以像这样的网址:

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

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

POST也比GET更安全,因为您没有将信息粘贴到网址中。因此,使用GET作为收集密码或其他敏感信息的HTML表单的method并非最佳选择。

最后一点:POST可以传输比GET更多的信息。 'POST'对传输的数据没有大小限制,而'GET'限制为2048个字符。

答案 1 :(得分:189)

简而言之

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

详情 每个人都有一个合适的地方。即使您不遵循RESTful原则,也可以从学习REST以及面向资源的方法如何工作中获得很多。

  

对于use GETs的操作,RESTful应用程序将safe and idempotent

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

idempotent操作是指无论您请求多少次,结果都为be the same的操作。

有理由认为,由于GET用于安全操作,因此它们也会自动幂等。通常,GET用于检索资源(例如,关于堆栈溢出的问题及其相关答案)或资源集合。

  

RESTful应用会将PUTs用于not safe but idempotent的操作。

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

通常,PUT用于编辑资源(例如,编辑有关堆栈溢出的问题或答案)。

  

POST将用于任何neither safe or idempotent的操作。

通常,POST将用于创建新资源,例如创建一个新的SO问题(尽管在某些设计中也会使用PUT)。

如果你两次运行POST,最终会产生两个新问题。

  

还有一个DELETE操作,但我猜我可以把它留在那里:)

<强>讨论

实际上,现代Web浏览器通常只能可靠地支持GET和POST(您可以通过javascript调用执行所有这些操作,但就在表单中输入数据和按提交而言,您通常有两个选项)。在RESTful应用程序中,POST通常会被覆盖以提供PUT和DELETE调用。

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

永远不要将GET用于改变数据的操作。如果搜索引擎抓取指向您的恶意操作的链接,或者客户端书签,则可能会遇到大麻烦。

答案 2 :(得分:74)

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

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

答案 3 :(得分:64)

短版

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

GET的优点:

  • 可以安全地为网址添加书签。
  • 页面可以安全重新加载。

GET的缺点:

POST:用于更高安全性请求,其中数据可用于更改数据库,或用于您不希望某人收藏的页面。

POST的优点:

  • 名称 - 值对不会显示在网址中。 (安全+ = 1)
  • 可以通过POST传递无限数量的名称 - 值对。 Reference.

POST的缺点:

  • 使用过POST数据的网页无法添加书签。 (如果你愿意的话。)

更长的版本

直接来自Hypertext Transfer Protocol -- 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标识。 POST是专门设计的   允许统一的方法来涵盖以下功能:

     
      
  • 现有资源的注释;

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

  •   
  • 提供一个数据块,例如提交的结果   形式,数据处理过程;

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

  •   
     

POST方法执行的实际功能由   服务器并且通常依赖于Request-URI。已发布的实体   以与文件从属相同的方式从属于该URI   在包含它的目录中,新闻文章从属于a   发布的新闻组,或者记录从属于a   数据库中。

     

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

答案 4 :(得分:27)

第一个重要的事情是GET与POST的含义

  • GET应该用于...从服务器
  • 获取的一些信息
  • 虽然应使用POST将一些信息发送到服务器。


在那之后,可以注意到几件事情:

  • 使用GET,您的用户可以在浏览器中使用“后退”按钮,他们可以将页面添加为书签
  • 您可以传递的参数大小有限制为GET (对于某些版本的Internet Explorer,如果我没有记错的话,则为2KB); POST的限制更多,通常取决于服务器的配置。


无论如何,我不认为没有GET就能“活”起来:想想你每天使用参数在查询字符串中使用了多少个URL - 没有GET,所有这些都不起作用; - )

答案 5 :(得分:11)

除了许多Web浏览器中的长度约束差异外,还存在语义差异。 GET应该是“安全的”,因为它们是不改变服务器状态的只读操作。 POST通常会更改状态,并会在重新提交时发出警告。搜索引擎的网络抓取工具可能会进行GET但不应该进行POST。

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

答案 6 :(得分:8)

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

答案 7 :(得分:8)

一个实际区别是浏览器和网络服务器对URL中可以存在的字符数有限制。它与应用程序的不同之处在于,如果你的表单中有textarea,那肯定可以点击它。

GET的另一个问题 - 它们被搜索引擎和其他自动系统索引。 Google曾经有一款产品可以预览您正在查看的页面上的链接,因此如果您点击这些链接,它们的加载速度会更快。它在有delete.php?id=1等链接的网站上造成了主要严重破坏 - 人们丢失了整个网站。

答案 8 :(得分:7)

如果希望URL反映页面状态,请使用GET。这对于查看动态生成的页面非常有用,例如此处显示的页面。应该在表单中使用POST来提交数据,例如当我单击“发布您的答案”按钮时。它还会生成一个更干净的URL,因为它不会在路径后生成参数字符串。

答案 9 :(得分:5)

因为GET是纯粹的URL,所以它们可以通过Web浏览器进行缓存,并且可以更好地用于一致生成的图像。 (设定到期时间)

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

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

要考虑的另一件事是尺寸限制。 GET受URL大小的限制,标准为1024字节,但浏览器可能支持更多。

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

正如另一张海报写的那样,即使低于这个限制也是一个问题,URL中的任何内容都可能最终出现在浏览器用户界面的其他部分,例如历史。

答案 10 :(得分:4)

1.3选择HTTP GETPOST

的快速核对表

如果出现以下情况,请使用GET:

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

使用POST if:

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

Source

答案 11 :(得分:4)

这涉及到REST的概念以及Web如何被用于使用。软件工程广播中有一个很好的podcast,可以深入讨论Get和Post的使用。

Get用于从服务器提取数据,不需要更新操作。我们的想法是你应该能够反复使用相同的GET请求并返回相同的信息。 URL在查询字符串中包含获取信息,因为它意味着能够轻松地发送到其他系统和人们喜欢在哪里查找某些内容的地址。

应该使用Post(至少通过Web架构所基于的REST架构)来将信息推送到服务器/告诉服务器执行操作。例如:更新此数据,创建此记录。

答案 12 :(得分:4)

本身没有什么是你无法做到的。关键是你不是假设来修改HTTP GET上的服务器状态。 HTTP代理假设由于HTTP GET不会修改状态,因此用户是调用HTTP GET一次还是1000次没有任何区别。使用此信息,他们假定返回第一个HTTP GET的缓存版本是安全的。如果您违反HTTP规范,则可能会破坏HTTP客户端和代理。不要这样做:)

答案 13 :(得分:3)

  

我没有看到使用get的问题,我将它用于简单的事情,将事情放在查询字符串上是有意义的。

使用它来更新状态 - 就像删除页面的delete.php?id=5的GET一样 - 是非常危险的。人们发现当Google的网络加速器开始在网页上预取URL时,它会点击所有'删除'链接并消灭人们的数据。搜索引擎蜘蛛也会发生同样的事情。

答案 14 :(得分:3)

来自RFC 2616

  

9.3 获取
  GET方法意味着检索任何信息(以...的形式)   一个实体)由   Request-URI中。如果Request-URI引用   对于数据生成过程,它是   产生的数据应归还   作为响应中的实体而不是   除非过程的源文本   该文本恰好是输出   这个过程。


  

9.5 POST
POST方法用于请求原始服务器   接受附在的实体   请求作为新的下属   Request-URI标识的资源   在请求行中。 POST是专门设计的   允许统一的方法来覆盖   以下功能:

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

由...执行的实际功能   POST方法由。确定   服务器并且通常依赖于   Request-URI中。发布的实体是   从属于该URI的同一个   文件从属于a的方式   包含它的目录,一则新闻   文章从属于新闻组   它的发布或记录   从属于数据库。

     

POST执行的操作   方法可能不会导致资源   可以通过URI识别。在   这种情况下,200(OK)或204(No.   内容)是适当的回应   状态,取决于是否   响应包括一个实体   描述结果。

答案 15 :(得分:3)

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

但一般来说,这并不是关于GET的缺点,而是一个惯例,如果你希望你的网站/ webapp表现得很好。

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

答案 16 :(得分:2)

当我不希望人们看到QueryString或QueryString变大时,我使用POST。此外,文件上传需要POST。

我没有看到使用GET的问题,我将它用于简单的事情,将事情保存在QueryString上是有意义的。

使用GET将允许在POST不起作用的情况下链接到特定页面。

答案 17 :(得分:2)

简单版本的POST GET PUT DELETE

  • 使用GET - 当您想获得任何资源,例如基于任何Id或名称的数据列表
  • 使用POST - 当您要将任何数据发送到服务器时。请记住,POST是重量级操作,因为对于更新,我们应该使用PUT而不是POST 内部POST将创建新资源
  • 使用PUT - 当你

答案 18 :(得分:1)

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

答案 19 :(得分:1)

阅读article about HTTP in the Wikipedia。它将解释协议是什么以及它的作用:

  

获取

     

请求指定资源的表示。请注意,GET不应用于导致副作用的操作,例如使用它在Web应用程序中执行操作。其中一个原因是机器人或爬虫可以任意使用GET,这不应该考虑请求应该引起的副作用。

  

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

W3C有一个名为URIs, Addressability, and the use of HTTP GET and POST的文件,说明何时使用什么。引用

  

1.3选择HTTP GET或POST的快速核对表

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

  
      
  • 使用POST如果:      
        
    • 互动更像是订单,或
    •   
    • 交互以用户将感知的方式(例如,对服务的订阅)改变资源的状态,或者     o用户应对交互结果负责。
    •   
  •   
     

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

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

答案 20 :(得分:1)

在PHP中,POST数据限制通常由php.ini设置。我认为GET受服务器/浏览器设置的限制 - 通常在255字节左右。

答案 21 :(得分:1)

来自w3schools.com

  

什么是HTTP?

     

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

     

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

     

Web浏览器可以是客户端,也可以是计算机上的应用程序   托管网站可能是服务器。

     

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

     

两种HTTP请求方法:GET和POST

     

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

     

GET - 从指定资源请求数据POST - 将数据提交到   被处理到指定的资源

我们在这里区分主要差异:

enter image description here

答案 22 :(得分:0)

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

编辑:我应该澄清 - 对于常见的编程模式。一般来说,响应具有直接HTML网页的POST是一个有问题的设计,原因有很多,其中一个是烦人的“你必须重新提交这个表单,你希望这样做吗?”按下后退按钮。

答案 23 :(得分:0)

一个重要的事情是,您通过GET提交的任何内容都将通过网址公开。其次,正如Ceejayoz所说,URL的字符数有限制。

答案 24 :(得分:0)

Gorgapor,mod_rewrite仍经常使用GET。它只允许将友好的URL转换为带有GET查询字符串的URL。

答案 25 :(得分:0)

正如其他人所回答的那样,get的网址大小有限制,文件只能用帖子提交。

我想补充一点可以通过get和for post操作向数据库添加内容。当脚本收到帖子或获取时,它可以做任何作者想要它做的事情。我认为缺乏理解来自于本书选择的措辞或者你如何阅读。

脚本作者使用帖子来更改数据库,并仅使用get来检索信息。

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

在网络编程中,有更多的解释空间。有一个应该可以做什么,但哪一个更好通常需要辩论。幸运的是,在这种情况下,没有歧义。您应该使用帖子来更改数据,而应该使用get来检索信息。

答案 26 :(得分:-1)

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

  

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

具体而言,您应该使用正确的HTTP构造它们用于什么。 HTTP GET不应该有副作用,可以通过HTTP代理等安全地刷新和存储。

当您想要针对网址资源提交数据时,会使用HTTP POST。

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