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

据我所知,有三种类型:

  1. 永远不要使用GET,而应该使用POST
  2. 永远不要使用POST,而应该使用GET
  3. 你用哪一个都不重要。

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

223817 次浏览

当您希望URL反映页面的状态时,请使用GET。这对于查看动态生成的页面非常有用,比如这里看到的页面。POST应该在表单中用来提交数据,就像我点击“POST Your Answer”按钮一样。它还生成了一个更干净的URL,因为它没有在路径后生成参数字符串。

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

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

最初的目的是GET用于获取数据,而POST用于任何用途。我使用的经验法则是,如果我要向服务器发送任何东西,我就使用POST。如果我只是调用一个URL来获取数据,我会使用get。

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

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

不过,我不认为使用GET有问题,我将它用于简单的事情,其中将内容保留在QueryString上是有意义的。

使用GET将允许链接到POST无法工作的特定页面。

使用POST进行破坏性操作,例如创建(我知道这很讽刺)、编辑和删除,因为你不能在浏览器的地址栏中点击POST操作。当允许一个人调用一个动作是安全的时候,使用GET。URL是这样的:

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

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

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

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

我不认为使用get有什么问题,我用它来做一些简单的事情,在查询字符串上保留东西是有意义的。

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

在短暂的

  • 对于safe andidempotent请求使用GET
  • neither safe nor idempotent请求使用POST

< >强在细节 每个人都有一个合适的位置。即使你不遵循宁静的原则,你也可以从学习REST和面向资源的方法如何工作中学到很多东西。< / p >

一个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用于编辑资源(例如,在堆栈溢出上编辑问题或答案)。

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

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

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

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

讨论

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

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

永远不要对改变数据的操作使用GET。如果搜索引擎抓取到你邪恶行动的链接,或者客户书签,这可能会带来大麻烦。

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

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

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

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

因为get是纯粹的url,它们可以被web浏览器缓存,并且可能更好地用于一致生成的图像之类的事情。(设置过期时间)

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

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

另一件需要考虑的事情是尺寸限制。get的上限是URL的大小,标准是1024字节,不过浏览器可能支持更多。

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

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

短的版本

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节所述。partial GET方法旨在通过允许完成部分检索的实体而不传输已经由客户端持有的数据来减少不必要的网络使用。

当且仅当GET请求的响应满足第13节中描述的HTTP缓存要求时,该响应是可缓存的。

关于表单使用时的安全注意事项,请参见15.1.3节。

9.5发布

POST方法用于请求源服务器接受 作为资源的新从属对象封装在请求中的实体 由Request-Line中的Request-URI标识。POST设计 允许一个统一的方法覆盖以下函数

  • 现有资源的注释;

  • 在公告栏、新闻组、邮件列表上发布消息, 或类似的文章组;

  • 提供数据块,如提交a的结果

  • . Form,到数据处理过程
  • 通过追加操作扩展数据库。

POST方法执行的实际函数由 服务器,通常依赖于Request-URI。发布的实体 从属于URI,就像文件从属于URI一样 对于包含新闻的目录,新闻文章从属于 信息发布到的新闻组,或者记录从属于 数据库。< / p >

由POST方法执行的操作可能不会导致 可以用URI标识的资源。在这个例子中,要么是200 (OK)或204 (No Content)是适当的响应状态, 这取决于响应是否包含一个实体

.输出说明

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

get的另一个问题是,它们会被搜索引擎和其他自动系统索引。谷歌曾经有一个产品,它可以在你正在浏览的页面上预取链接,所以如果你点击这些链接,它们会更快地加载。它在有像delete.php?id=1这样链接的网站上造成了主要大破坏——人们失去了他们的整个网站。

第一个重要的东西是GET和POST的意义:

  • GET应该用来…得到……一些信息服务器,
  • 而POST应该用来发送一些信息服务器。
< p > < br > 在那之后,有几件事需要注意:

  • 使用GET,用户可以在浏览器中使用“后退”按钮,并且可以将页面添加为书签
  • 可以作为GET (如果我没记错的话,某些版本的ie浏览器为2KB)传递的参数的大小是有限制的;POST的限制更多,通常取决于服务器的配置。
< p > < br > 无论如何,我不认为我们可以“生活”没有GET:想想你每天在查询字符串中使用多少带参数的url——没有GET,所有这些都不能工作;-)

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

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

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

但一般来说,这不是关于GET的缺点,而是一种惯例,如果你想让你的网站/web应用程序表现良好。

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

除了许多浏览器的长度限制不同之外,还有语义上的差异。get应该是“安全的”,因为它们是只读操作,不会改变服务器状态。post通常会改变状态,并在重新提交时给出警告。搜索引擎的网络爬虫可能会生成get,但不应该生成post。

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

一个重要的事情是,你通过GET提交的任何东西都会通过URL被暴露。其次,正如Ceejayoz所说,URL的字符数量是有限制的。

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

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

具体来说,您应该根据它们的用途选择正确的HTTP结构。HTTP GET不应该有副作用,可以被HTTP代理等安全地刷新和存储。

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

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

没有什么是你本身做不到的。关键是你不是应该来修改HTTP GET上的服务器状态。HTTP代理假设由于HTTP GET不修改状态,那么用户调用HTTP GET一次还是1000次没有区别。使用这些信息,他们认为返回第一个HTTP GET的缓存版本是安全的。如果你破坏了HTTP规范,你就有破坏HTTP客户端和代理的风险。不要这样做:)

RFC 2616:

3 . 得到
GET方法意味着检索任何信息(形式为 实体)由 要求通用。如果Request-URI引用 对于数据生成过程,它是 应返回的已生成数据 作为响应中的实体而不是 进程的源文本,除非 这个文本恰好是的输出 这个过程。< / p >


9.5 帖子
POST方法用于请求源服务器 中所包含的实体 请求担任新的下属 由Request-URI标识的资源 在请求行。POST设计 让一个统一的方法来覆盖 以下函数:

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

实际执行的函数 POST方法由 服务器,通常依赖于 要求通用。发布的实体为 从属于同一个URI 文件从属于 目录包含了它,一个新闻 文章隶属于新闻组 它被张贴到,或者记录是 从属于数据库。< / p >

POST执行的动作 方法可能不会生成资源 可以由URI标识的信息。在 在这种情况下,200 (OK)或204 (No 内容)是适当的回应 状态,取决于是否 响应包括一个实体,它

.输出说明

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

得到

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

而且

< >强柱 向已识别的资源提交要处理的数据(例如,来自HTML表单)。数据包含在请求体中。这可能导致创建新资源或更新现有资源或两者兼有

W3C有一个名为uri,可寻址性,以及HTTP GET和POST的使用的文档来解释什么时候使用什么。引用

1.3 HTTP GET / POST选择快速检查

  • 如果:
    • 交互更像是一个问题(也就是说,它是一个问题 安全操作,如查询、读操作或查找) 李< / ul > < / >

而且

  • 如果:
    • 这种互动更像是一种命令,或者
    • 交互以用户可以感知的方式改变资源的状态(例如,订阅服务),或者 用户对交互的结果负责。
    • 李< / ul > < / >

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

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

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

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

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

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

在web编程中,有更多的解释空间。有一个应该和一个可以做什么,但哪一个更好经常引起争论。幸运的是,在这种情况下,没有歧义。你应该使用post来更改数据,你应该使用get来检索信息。

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

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:

    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.

简单版本的POST GET PUT DELETE

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

w3schools.com:

什么是HTTP?

HTTP (Hypertext Transfer Protocol)是用来启用的

.客户端与服务器端的通信

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

web浏览器可以是客户端,也可以是计算机上的应用程序

.主机一个网站可能是服务器

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

两种HTTP请求方法:GET和POST

客户端和客户机之间的请求-响应的两种常用方法 GET和POST.

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

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

enter image description here