POST 和 GET 有啥区别? [复制]
Posted
技术标签:
【中文标题】POST 和 GET 有啥区别? [复制]【英文标题】:What is the difference between POST and GET? [duplicate]POST 和 GET 有什么区别? [复制] 【发布时间】:2011-03-29 11:40:06 【问题描述】:我最近才开始涉足 php/AJAX/jQuery,在我看来,这些技术的一个重要部分是 POST
和 GET
。
首先,POST
和 GET
有什么区别?通过实验,我知道GET
将返回的变量及其值附加到URL字符串中
website.com/directory/index.php?name=YourName&bday=YourBday
但POST
没有。
那么,这是唯一的区别,还是有特定的规则或约定可以使用其中一种?
其次,我还在 PHP 之外看到了 POST
和 GET
:也在 AJAX 和 jQuery 中。 POST
和 GET
这三个有什么区别?它们是相同的想法,相同的功能,只是使用方式不同吗?
【问题讨论】:
有趣的是,这个问题被关闭了,但它的浏览量是被骗者的两倍。也许我们关闭了错误的问题... 这个问题比它被标记为重复的问题有更好的答案。差别不大,但这更有帮助。 另一个问题要好得多。是时候产生嵌合后代了吗? 另见***.com/a/63170529/989468 这篇文章解释的很好,3分钟读完,medium.com/@muhammadusmanalibaloch/… 【参考方案1】:GET
和 POST
是两种不同类型的 HTTP 请求。
根据Wikipedia:
GET 请求指定资源的表示。请注意,GET 不应用于会导致副作用的操作,例如在 Web 应用程序中使用它来执行操作。这样做的一个原因是 GET 可能被机器人或爬虫任意使用,不需要考虑请求应该引起的副作用。
和
POST 将要处理的数据(例如,从 html 表单)提交到已识别的资源。数据包含在请求的正文中。这可能会导致创建新资源或更新现有资源或两者兼而有之。
所以本质上GET
用于检索远程数据,POST
用于插入/更新远程数据。
HTTP/1.1 规范 (RFC 2616) 第 9 节 Method Definitions 包含有关
GET
和 POST
以及其他 HTTP 方法的更多信息,如果您有兴趣的话。
除了解释每种方法的预期用途外,该规范还提供了至少一个实际原因,说明为什么 GET
应该只用于检索数据:
使用 HTTP 协议的服务的作者不应该使用基于 GET 的表单来提交敏感数据,因为这会导致该数据被编码到 Request-URI 中。许多现有的服务器、代理和用户代理会将请求 URI 记录在第三方可能看到的某个地方。服务器可以改用基于 POST 的表单提交
最后,在将
GET
用于 AJAX 请求时,一个重要的考虑因素是某些浏览器 - 特别是 IE - 将缓存 GET
请求的结果。因此,例如,如果您使用相同的GET
请求进行轮询,您将始终得到相同的结果,即使您正在查询的数据正在服务器端更新。缓解此问题的一种方法是通过附加时间戳使每个请求的 URL 唯一。
【讨论】:
.. 有趣。感谢您解释这背后的缓存。两个问题... 1. 这是否意味着使用GET
存在安全问题 2. 这是否意味着我可以使用POST
做与GET
相同的事情?
@Hristo:您也可以使用GET
在服务器上进行更新,是的。反之亦然。您可以使用POST
来获取一些数据。再次用我的汽车类比:即使你的汽车有倒档,你也不会倒车上班。即使你当然可以。
@Hristo:GET 本身没有问题——每个站点的主页都是通过 GET 获取的,几乎所有链接都是如此,因此任何安全问题都可能破坏整个网络。当 Web 开发人员不知道 GET 应该是幂等的并将其用于“删除”或“添加到购物车”链接/按钮等操作时,就会出现问题。
@barlop - “数据包含在请求正文中。”
缓解 IE 缓存 GET 调用的另一种方法是在服务器端为传入的 GET 请求设置标头。这些标头会阻止客户端缓存。【参考方案2】:
POST
与 GET
不同,通常在请求正文中包含相关信息。 (GET
不应该有正文,所以除了 cookie,唯一传递信息的地方就是 URL。)除了保持 URL 相对干净,POST
还可以让你发送更多信息(因为 URL 是有限的长度,出于所有实际目的),并允许您发送几乎任何类型的数据(例如,文件上传表单不能使用 GET
- 他们必须使用 POST
加上特殊的内容类型/编码)。
除此之外,POST
表示该请求会改变某些内容,并且不应随意重做。这就是为什么您有时会看到您的浏览器在您点击“返回”按钮时询问您是否要重新提交表单数据。
GET
应该是 idempotent —— 这意味着你可以做一百万次,而服务器每次都会做同样的事情(并显示基本相同的结果)并且每次。
【讨论】:
【参考方案3】:虽然没有描述差异,但以下是在选择正确方法时需要考虑的几件事。
GET 请求可能会被浏览器缓存,这在使用 ajax 时可能会成为问题(或好处)。 GET 请求向用户公开参数(POST 也可以,但它们不太明显)。 POST 可以将更多信息传递给服务器,并且几乎可以是任意长度。【讨论】:
您在描述 POST 时没有使用“请求”这个词有什么原因吗? (尽管许多人说 POST 是一种请求) 所以如果 POST 也暴露了参数,只是稍微不那么明显,那么如果我担心敏感信息被看到,那么使用 POST 还是 GET 正确并不重要?寻找信息的人可能对如何查看 POST 中的参数有足够的了解。只是想知道我是否理解正确。谢谢。 @eaglei22,我从上面 Justin Ethier 的回答中复制了这个。 > 使用 HTTP 协议的服务的作者不应该使用基于 GET 的表单来提交敏感数据,因为这将导致该数据被编码在 Request-URI 中。许多现有的服务器、代理和用户代理会将请求 URI 记录在第三方可能看到的某个地方。服务器可以使用基于 POST 的表单提交 长话短说,使用 POST 处理敏感数据【参考方案4】:POST 和 GET 是两个HTTP request methods。 GET 通常是为了检索一些数据,并且期望是幂等的(重复查询没有任何副作用)并且只能向服务器发送有限数量的参数数据。如果您不小心,GET 请求通常会被某些浏览器默认缓存。
POST 用于更改服务器状态。它携带更多数据,并且允许(并且通常预期)重复查询会产生副作用,例如创建两条消息而不是一条消息。
【讨论】:
还值得一提的是,机器人等知道不做 POST 事情,以防万一它导致某些操作(如删除数据)发生。 顾名思义,“幂等”意味着比“无副作用”更复杂一点的东西。这意味着任何数量的相同请求都将导致服务器端资源的可见状态完全相同。但是请求可以引起变化。例如,PUT
和 DELETE
也是幂等的。【参考方案5】:
如果您在RESTfully 工作,GET 应该用于您只获取数据的请求,而 POST 应该用于您正在做某事的请求。
一些例子:
获取显示特定 SO 问题的页面
发表评论
点击“添加到购物车”按钮发送 POST 请求。
【讨论】:
.. 我不确定你所说的“RESTfully”是什么意思,但你是说如果GET
用于获取数据...POST
用于发送数据?或者POST
也可以获取数据并使用它来做某事?【参考方案6】:
使用 POST,您还可以进行多部分 mime 编码,这意味着您也可以附加文件。此外,如果您在页面导航中使用 post 变量,用户将收到一条警告,询问他们是否要重新提交 post 参数。通常它们在 HTTP 请求中看起来是一样的,但是如果您需要将某些内容“发布”到服务器,您应该坚持使用 POST,如果您需要从服务器获取某些内容,则应该坚持使用“GET”,因为这就是它们的预期方式。
【讨论】:
【参考方案7】:POST 和 GET 之间唯一的“大”区别(与 AJAX 一起使用时)是因为 GET 是 URL 提供的,所以它们的长度是有限的(因为 URL 的长度不是无限的)。
【讨论】:
.. 它们是如何使用的? 哦,好吧,如果您忽略所有其他差异,例如语义、链接、缓存、可重复性等,那是“唯一”的大差异。 我的意思是在 AJAX 中将它们用作 OP 时的巨大差异......以上是关于POST 和 GET 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
pd.get_dummies 和 sklearn 是 python 中的一个热门编码器有啥区别? [复制]
两种类型的jQuery AJAX调用之间的区别:'GET'和类型:'POST'? [复制]
比较对象类型时 typeof 和 is 有啥区别? [复制]