据我所知,可以分为三类:

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

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

有帮助吗?

解决方案

使用 POST 用于破坏性操作,例如创建(我知道这很讽刺)、编辑和删除,因为你无法击中 POST 浏览器地址栏中的操作。使用 GET 当可以安全地允许某人调用操作时。所以像这样的 URL:

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

应该带您进入确认页面,而不是简单地删除该项目。这样就更容易避免事故。

POST 也比 GET, ,因为您没有将信息粘贴到 URL 中。所以使用 GET 作为 method 对于收集密码或其他敏感信息的 HTML 表单来说并不是最好的主意。

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

其他提示

简单来说

  • 使用 GET 为了 safe andidempotent 要求
  • 使用 POST 为了 neither safe nor idempotent 要求

详细信息每个人都有一个合适的位置。即使你不跟随 宁静的 了解 REST 以及面向资源的方法的工作原理可以让您获益匪浅。

RESTful 应用程序将 use GETs 对于两者都是的操作 safe and idempotent.

A safe 操作是一个操作 not change the data 要求。

一个 idempotent 操作是一种结果将 be the same 无论您请求多少次。

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

RESTful 应用程序将使用 PUTs 对于以下操作 not safe but idempotent.

我知道问题是关于 GET 和 POST,但我稍后会回到 POST。

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

A POST 将用于任何操作 neither safe or idempotent.

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

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

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

讨论

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

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

切勿将 GET 用于更改数据的操作。如果搜索引擎抓取到您的邪恶操作的链接或客户端书签,则可能会带来大麻烦。

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

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

简洁版本

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

GET 的优点:

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

GET 的缺点:

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

邮政的优点:

  • 名称-值对不会显示在 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 后处理

邮政方法用于请求原始服务器接受请求中封闭的实体作为Request-uroi在请求行中标识的资源的新从属。帖子旨在允许统一的方法涵盖以下功能:

  • 现有资源的注释;

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

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

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

通过邮政方法执行的实际功能由服务器确定,通常取决于请求-URI。张贴的实体是从属于该URI的下属,就像文件从属于包含其的目录一样,新闻文章服从于其发布的新闻组,或者记录是从属数据库。

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

第一件重要的事情是 意义 GET 与 POST 的比较:

  • GET 应该用于...得到...一些信息 服务器,
  • 而POST应该用来发送一些信息 服务器。


之后,有几件事需要注意:

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


不管怎样,我认为没有 GET 我们就无法“生存”:想一想您每天在查询字符串中使用了多少个带参数的 URL —— 如果没有 GET,所有这些都不起作用;-)

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

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

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

一个实际的区别是浏览器和网络服务器对 URL 中可以存在的字符数有限制。每个应用程序的情况都不同,但如果您有的话,当然有可能成功 textarea在您的表格中。

GET 的另一个问题是它们会被搜索引擎和其他自动系统编入索引。谷歌曾经有一款产品可以预先获取您正在查看的页面上的链接,因此如果您单击这些链接,它们的加载速度会更快。它引起了 主要的 对具有类似链接的网站造成严重破坏 delete.php?id=1 - 人们失去了整个网站。

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

由于 GET 是纯粹的 URL,因此它们可以由 Web 浏览器缓存,并且可能更适合用于一致生成的图像之类的事情。(设置过期时间)

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

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

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

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

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

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

这涉及到 REST 的概念以及网络的使用目的。有一个优秀的 播客 在软件工程广播中,深入讨论了 Get 和 Post 的使用。

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

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

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

如果出现以下情况,请使用 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.

来源.

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

使用它来更新状态 - 就像 GET 一样 delete.php?id=5 删除页面 - 风险很大。人们发现,当谷歌的网络加速器开始预取页面上的 URL 时,它会点击所有“删除”链接并清除人们的数据。搜索引擎蜘蛛也会发生同样的情况。

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

但一般来说,这不是 GET 的缺点,而是一个约定,如果您希望您的网站/网络应用程序表现良好的话。

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

RFC 2616:

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


9.5 邮政
邮政方法用于请求原始服务器接受请求中封闭的实体作为Request-uroi在请求行中标识的资源的新从属。帖子旨在允许统一的方法涵盖以下功能:

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

通过邮政方法执行的实际功能由服务器确定,通常取决于请求-URI。张贴的实体是从属于该URI的下属,就像文件从属于包含其的目录一样,新闻文章服从于其发布的新闻组,或者记录是从属数据库。

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

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

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

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

POST GET PUT DELETE 的简单版本

  • 使用 GET - 当您想要获取任何资源(例如基于任何 ID 或名称的数据列表)时
  • 使用 POST - 当您想将任何数据发送到服务器时。请记住,帖子是重量重量操作
  • 使用 PUT - 当您

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

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

得到

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

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

W3C 有一个文档名为 URI、可寻址性以及 HTTP GET 和 POST 的使用 这解释了何时使用什么。引用

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

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

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

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

一个实际的例子是每当您提交 HTML 表单时。您指定 邮政 或者 得到 对于表单操作。PHP 将相应地填充 $_GET 和 $_POST。

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

w3schools.com:

什么是 HTTP?

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

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

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

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

两种HTTP请求方法:获取和发布

客户端和服务器之间的请求响应的两种常用方法是:获取和发布。

获取 - 从指定资源帖子中请求数据 - 提交要处理的数据

这里我们区分一下主要区别:

enter image description here

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

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

编辑:我应该澄清一下常见的编程模式。通常,出于各种原因,使用直截了当的HTML网页响应帖子是一个可疑的设计,其中之一是“您必须重新提交此形式,您想这样做吗?”按下后面按钮。

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

我想添加一个 使用 get 将内容添加到数据库并使用 post 执行操作。当脚本收到 post 或 get 时,它可以执行作者希望它执行的任何操作。我相信缺乏理解来自于这本书所选择的措辞或你如何阅读它。

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

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

在网络编程中,有更多的解释空间。有哪一个 应该 以及哪一个 这样做,但哪一个更好经常引起争论。幸运的是,在这种情况下,没有任何歧义。你 应该 使用帖子来更改数据,并且您 应该 使用 get 来检索信息。

戈尔加波尔, mod_rewrite 仍然经常使用 GET. 。它只是允许将更友好的 URL 转换为带有 GET 请求参数。

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

服务器应谨慎对255个字节以上的URI长度谨慎,因为某些较旧的客户或代理实现可能无法正确支持这些长度

具体来说,您应该根据其用途使用正确的 HTTP 结构。HTTP GET 不应该有副作用,并且可以通过 HTTP 代理等安全地刷新和存储。

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

使用 HTTP GET 的典型示例是搜索,即搜索?查询=我的+查询使用HTTP帖子的一个典型示例是向在线表单提交反馈。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top