387

据我所知,分为三类:

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

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

4

27 回答 27

422

用于POST破坏性操作,例如创建(我知道具有讽刺意味)、编辑和删除,因为您无法POST在浏览器的地址栏中点击操作。GET在允许某人调用操作是安全的情况下使用。所以一个像这样的网址:

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

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

POST也比 更安全GET,因为您没有将信息粘贴到 URL 中。因此,将GETmethod用作收集密码或其他敏感信息的 HTML 表单并不是最好的主意。

最后一点:POST可以传输比GET. “POST”对传输的数据没有大小限制,而“GET”限制为 2048 个字符。

于 2008-09-05T19:12:17.473 回答
231

简单来说

  • 用于请求GET_safe andidempotent
  • 用于请求POST_neither safe nor idempotent

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

一个 RESTful 应用程序将use GETs用于两者的操作safe and idempotent

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

一项idempotent操作是be the same无论您请求多少次,结果都会发生的操作。

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

RESTful 应用程序将PUTs用于not safe but idempotent.

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

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

APOST将用于任何操作,即neither safe or idempotent.

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

如果您运行两次 POST,您最终会创建两个新问题。

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

讨论

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

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

您永远不应该将 GET 用于更改数据的操作。如果搜索引擎抓取了指向您的恶意操作的链接,或者客户端添加了书签,则可能会带来很大的麻烦。

于 2008-09-05T19:18:03.573 回答
84

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

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

于 2008-09-05T19:07:37.547 回答
67

简洁版本

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

GET的优点:

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

GET的缺点:

POST:用于更高安全性的请求,其中数据可用于更改数据库或您不希望有人添加书签的页面。

POST的优点:

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

POST的缺点:

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

更长的版本

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

9.3 获取

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 方法用于请求源服务器接受请求中包含的实体,作为 Request-Line 中 Request-URI 标识的资源的新下级。POST 旨在允许统一的方法涵盖以下功能:

  • 现有资源的注释;

  • 将消息发布到公告板、新闻组、邮件列表或类似的文章组;

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

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

POST 方法执行的实际功能由服务器确定,通常取决于 Request-URI。发布的实体从属于该 URI,就像文件从属于包含它的目录一样,新闻文章从属于发布它的新闻组,或者一条记录从属于数据库。

POST 方法执行的操作可能不会产生可由 URI 标识的资源。在这种情况下,200(正常)或 204(无内容)是适当的响应状态,具体取决于响应是否包含描述结果的实体。

于 2009-06-03T09:42:42.620 回答
30

首先重要的是GET 与 POST的含义:

  • GET 应该用于...服务器获取... 一些信息,
  • 而 POST 应该用于向服务器发送一些信息


在那之后,有几点需要注意:

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


无论如何,我认为如果没有 GET,我们将无法“生活”:想想你每天在查询字符串中使用多少个带有参数的 URL——没有 GET,所有这些都行不通;-)

于 2010-02-15T17:49:10.523 回答
13

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

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

于 2010-02-15T17:50:03.093 回答
8

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

于 2008-09-05T19:08:25.983 回答
8

一个实际的区别是浏览器和网络服务器对 URL 中可以存在的字符数有限制。它因应用程序而异,但如果您textarea的表单中有 s,当然可以点击它。

GET 的另一个问题——它们被搜索引擎和其他自动系统索引。谷歌曾经有一个产品可以在你正在查看的页面上预先获取链接,所以如果你点击这些链接,它们的加载速度会更快。它对那些有链接的网站造成了严重delete.php?id=1破坏——人们失去了他们的整个网站。

于 2010-02-15T17:48:30.883 回答
7

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

于 2008-09-05T19:07:06.657 回答
6

因为 GET 是纯粹的 URL,它们可以被 Web 浏览器缓存,并且可以更好地用于诸如一致生成的图像之类的事情。(设置到期时间)

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

GET 可能会产生更好的性能,一些网络服务器在调用处理程序之前将 POST 内容写入临时文件。

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

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

正如另一位发帖者所写,即使低于该限制也是一个问题,URL 中的任何内容都可能最终出现在浏览器 UI 的其他部分中,例如历史记录。

于 2008-09-06T08:46:15.893 回答
5

1.3 选择 HTTPGETPOST

在以下情况下使用 GET:

    The interaction is more like a question (i.e., 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 (e.g., a subscription to a service), or
    The user be held accountable for the results of the interaction.

来源

于 2013-08-29T12:41:01.850 回答
4

这涉及到 REST 的概念以及 web 是如何被使用的。软件工程电台上有一个很棒的播客,它深入讨论了 Get 和 Post 的使用。

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

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

于 2008-09-05T19:23:31.550 回答
4

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

于 2010-02-15T17:53:19.110 回答
3

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

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

于 2008-09-05T19:13:00.233 回答
3

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

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

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

于 2010-02-15T17:49:23.730 回答
3

来自RFC 2616

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


9.5 POST
POST 方法用于请求源服务器接受请求中包含的实体作为请求行中的请求URI 标识的资源的新下级。POST 旨在允许统一的方法涵盖以下功能:

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

POST 方法执行的实际功能由服务器确定,通常取决于 Request-URI。发布的实体从属于该 URI,就像文件从属于包含它的目录一样,新闻文章从属于发布它的新闻组,或者一条记录从属于数据库。

POST 方法执行的操作可能不会产生可由 URI 标识的资源。在这种情况下,200(正常)或 204(无内容)是适当的响应状态,具体取决于响应是否包含描述结果的实体。

于 2010-02-15T17:53:47.723 回答
2

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

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

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

于 2008-09-05T19:09:22.377 回答
1

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

于 2008-09-05T19:08:07.263 回答
1

阅读Wikipedia 中有关 HTTP 的文章。它将解释协议是什么以及它的作用:

得到

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

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

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

1.3 选择 HTTP GET 或 POST 的快速清单

  • 在以下情况下使用 GET:
    • 交互更像是一个问题(即,它是一种安全操作,例如查询、读取操作或查找)。

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

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

一个实际的示例是每当您提交 HTML 表单时。您为表单操作指定postget。PHP 将相应地填充 $_GET 和 $_POST。

于 2010-02-15T17:54:49.887 回答
1

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

于 2010-02-15T19:13:56.297 回答
1

来自w3schools.com

什么是 HTTP?

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

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

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

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

两种 HTTP 请求方法:GET 和 POST

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

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

在这里,我们区分主要区别:

在此处输入图像描述

于 2016-03-13T12:27:59.293 回答
0

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

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

于 2010-02-15T17:49:23.633 回答
0

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

于 2010-02-15T17:50:18.590 回答
0

正如其他人所回答的那样,get 对 url 大小有限制,并且文件只能通过 post 提交。

我想补充一点,可以通过 get 向数据库添加内容并通过 post 执行操作。当一个脚本收到一个 post 或一个 get 时,它可以做任何作者想要它做的事情。我相信缺乏理解来自这本书选择的措辞或你如何阅读它。

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

脚本语言提供了许多访问请求的方法。例如,PHP 允许使用$_REQUEST来检索帖子或获取。应该避免这种情况,而使用更具体的$_GETor $_POST

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

于 2010-02-15T18:22:59.107 回答
-1

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

于 2008-09-05T19:48:00.490 回答
-1

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

服务器应谨慎使用超过 255 字节的 URI 长度,因为一些较旧的客户端或代理实现可能无法正确支持这些长度

具体来说,您应该为它们的用途选择正确的 HTTP 构造。HTTP GET 不应该有副作用,并且可以通过 HTTP 代理等安全地刷新和存储。

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

使用 HTTP GET 的典型示例是在 Search 上,即 Search?Query=my+query 使用 HTTP POST 的典型示例是向在线表单提交反馈。

于 2010-02-15T17:52:03.323 回答
-1

POST GET PUT DELETE 的简单版本

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