什么时候应该使用 GET 或 POST 方法?他们之间有什么区别?

Posted

技术标签:

【中文标题】什么时候应该使用 GET 或 POST 方法?他们之间有什么区别?【英文标题】:When should I use GET or POST method? What's the difference between them? 【发布时间】:2010-10-05 00:47:18 【问题描述】:

使用GETPOST 方法有什么区别?哪个更安全?它们各自有什么(缺点)优点?

(similar question)

【问题讨论】:

Get 没有正文,因此在实践中意味着您仅限于名称 -> 值对作为数据结构,因为缺少用于更复杂结构的任何查询字符串编码格式。如果您需要在请求中处理更复杂的数据结构(即数组、对象等),您需要使用 POST 以及可能更高级的格式(json/xml)。简短地说:除非你真的必须这样做(即 URL/资源必须是可发现的),否则不要使用 GET。 When do you use POST and when do you use GET?的可能重复 【参考方案1】:

这不是安全问题。 HTTP 协议将 GET 类型的请求定义为 idempotent,而 POST 可能有副作用。用简单的英语来说,这意味着 GET 用于查看某些内容,而不更改它,而 POST 用于更改某些内容。例如,搜索页面应该使用 GET,而更改密码的表单应该使用 POST。

另外,请注意 php 有点混淆了这些概念。 POST 请求从查询字符串和请求正文中获取输入。 GET 请求只是从查询字符串中获取输入。所以 POST 请求是 GET 请求的超集;您可以在 POST 请求中使用 $_GET,甚至可以在 $_POST$_GET 中使用具有相同名称的参数来表示不同的含义。

例如,假设您有一个用于编辑文章的表单。 article-id 可能在查询字符串中(因此,可以通过$_GET['id'] 获得),但假设您要更改article-id。然后新的 id 可能会出现在请求正文中 ($_POST['id'])。好吧,也许这不是最好的例子,但我希望它能说明两者之间的区别。

【讨论】:

GET 和 POST 之间的区别肯定存在安全方面的问题。例如,恶意网站可以在图像标签中粘贴任意 GET 请求,从而导致用户对另一台服务器执行 GET。如果这个 GET 类似于 otherserver/deletemyaccount,那么就会发生不好的事情。 我的意思是 $_POST 的内容并没有神奇地对恶意用户隐藏。显然,所有事物编程都有安全方面的问题。 这篇文章没有完全回答这个问题,因为他没有提到安全隐患。只要把拼写错误“pain English”改成“plain English”就可以了。底部太难理解了。总的来说,比我的帖子好多了。 :-) " POST 请求从查询字符串和请求正文中获取输入。"恕我直言,这是不正确的。要使用任一输入,您需要使用 $_REQUEST。 $_POST 没有获取 url 条目。 @Frank Schwieterman 我知道这篇文章很旧,但删除我的帐户不是幂等的,不应该使用 get。【参考方案2】:

当用户在表单中输入信息并单击提交时,可以通过两种方式将信息从浏览器发送到服务器:在 URL 中,或在 HTTP 请求的正文中。

前面示例中使用的 GET 方法将名称/值对附加到 URL。不幸的是,URL 的长度是有限的,所以这种方法只有在只有几个参数的情况下才有效。如果表单使用大量参数,或者如果参数包含大量数据,则 URL 可能会被截断。此外,在 URL 上传递的参数在浏览器的地址字段中可见,而不是显示密码的最佳位置。

GET 方法的替代方法是 POST 方法。此方法将名称/值对打包在 HTTP 请求的正文中,这使得 URL 更清晰,并且对表单输出没有大小限制。它也更安全。

【讨论】:

因为它更难改变?您可以在地址栏中更改 GET,但使用 POST 并不那么容易。 服务器无法信任客户端。围绕错误假设设计应用程序远非安全。 openid 也没有保存,因为可以破解? 我相信这是最清楚的解释——发送数据的位置不同。谢谢。 客户端也可以用curl或者ajax发起get请求,随便写什么。【参考方案3】:

最好的答案是第一个。

您正在使用:

GET 当您想要检索数据时 (GET DATA)。 POST 当您想要发送数据时(POST DATA)。

【讨论】:

什么是请求/响应服务模式,你想要两者都做吗? ;) 当我需要回复时,我宁愿在大多数情况下使用 POST。 一般来说是这样。 GET 也完全能够“发送”数据,因此不是一个非常准确的答案。【参考方案4】:

使用GET 有两个常见的“安全”含义。由于数据出现在 URL 字符串中,因此可能有人在地址栏/URL 上查看您的肩膀可能能够查看他们不应该知道的内容,例如可能被用来劫持您的会话的会话 cookie。请记住每个人都有拍照手机。

GET 的另一个安全含义与 GET 变量作为请求 URL 的一部分记录到大多数 Web 服务器访问日志有关。根据情况、监管环境和数据的一般敏感性,这可能会引起关注。

某些客户端/防火墙/IDS 系统可能不赞成包含过多数据的 GET 请求,因此可能会提供不可靠的结果。

POST 支持高级功能,例如支持用于将文件上传到 Web 服务器的多部分二进制输入。

POST 需要一个 content-length 标头,这可能会增加特定于应用程序的客户端实现的复杂性,因为必须提前知道提交的数据大小,以防止客户端请求以独占的单通道增量模式形成。对于那些选择滥用HTTP 将其用作 RPC(远程过程调用)传输的人来说,这可能是一个小问题。

其他人已经很好地涵盖了这个问题的语义差异和“何时”部分。

【讨论】:

【参考方案5】:

如果有大量数据或某种敏感信息(真正敏感的东西也需要安全连接),您应该使用 POST。

如果您希望人们能够为您的页面添加书签,请使用 GET,因为所有数据都包含在书签中。

请注意人们使用 GET 方法点击 REFRESH,因为每次都会再次发送数据而不会警告用户(POST 有时会警告用户重新发送数据)。

【讨论】:

如果端点接受文件并从文件中返回一行(不涉及数据创建或更改或数据库),那么端点应该是GET还是POST? @variable POST。在这种情况下,主要是因为 POST 是为处理文件上传而构建的,而标准 GET 不是。每次页面加载时您都必须发送文件,因此使用标准 POST 而不是 GET+file 是有意义的,这会打破 GET 的期望,即 URL 每次都应该提供或多或少相同的结果。 【参考方案6】:

当我一个 URL 检索信息时我使用 GET,当我向一个 URL发送信息时使用 POST。

【讨论】:

但您也可以使用 GET 发送。区别在于格式(在 url (GET) 或在请求 (POST) 中)。 如果端点接受一个文件并从文件中返回一行(不涉及数据创建或更改或数据库),那么端点应该是GET还是POST?【参考方案7】:

W3C document 解释了 HTTP GET 和 POST 的使用。

我认为这是一个权威来源。

摘要是(文档的第 1.3 节):

如果交互更像是一个问题(即,它是查询、读取操作或查找等安全操作),请使用 GET。 在以下情况下使用 POST: 交互更像是一个订单,或者 交互以某种方式更改资源的状态 用户会感知(例如,订阅服务),或 用户应对交互结果负责。

【讨论】:

我觉得可以进一步概括为:服务器状态不变时GET,状态不变时POST。【参考方案8】:

Get 和 Post 方法与您使用的服务器技术无关,它在 php、asp.net 或 ruby​​ 中的工作方式相同。 GET 和 POST 是 HTTP 协议的一部分。 正如标记所指出的,POST 更安全。 POST 表单也不会被浏览器缓存。 POST 也用于传输大量数据。

【讨论】:

【参考方案9】:

修改数据时使用POST的原因:

像 Google Web Accelerator 这样的 Web 加速器将单击页面上的所有 (GET) 链接并缓存它们。如果链接对事物进行更改,这将非常糟糕。 浏览器缓存 GET 请求,因此即使用户单击链接,它也可能不会向服务器发送请求以执行更改。 要保护您的站点/应用程序免受 CSRF 攻击,您必须使用 POST。为了完全保护您的应用,您还必须在服务器上生成一个唯一标识符并在请求中将其发送。

另外,不要将敏感信息放在查询字符串中(只有 GET 选项),因为它会显示在地址栏、书签和服务器日志中。

希望这可以解释为什么人们说 POST 是“安全的”。如果您要传输敏感数据,则必须使用 SSL。

【讨论】:

【参考方案10】:

GETPOST 是 HTTP 方法,可以实现类似的目标

GET 基本上只是为了获取(检索)数据,GET 不应该有正文,所以除了 cookie,唯一传递信息的地方是 URL,并且 URL 的长度有限,@987654325与POST 相比,@ 的安全性较低,因为发送的数据是 URL 的一部分

发送密码、信用卡或其他敏感信息时切勿使用GET!,URL 中的数据对所有人可见,可缓存数据。 GET 在我们重新加载或回调按钮时是无害的,它会被标记,参数保留在浏览器历史中,只允许 ASCII 字符。

POST 可能涉及任何事情,例如存储或更新数据、订购产品或发送电子邮件。 POST 方法有一个主体。

POST 方法被保护用于将敏感和机密信息传递给服务器,它不会在 URL 中的查询参数中可见,并且参数不会保存在浏览器历史记录中。数据长度没有限制。当我们重新加载时,浏览器应该提醒用户数据即将被重新提交。 POST 方法无法添加书签

【讨论】:

【参考方案11】:

这个问题和other 与GETPOST 相关的SO 问题中的所有或大部分答案都是错误的。它们在技术上是正确的,并且正确地解释了standards,但实际上它完全不同。让我解释一下:

GET 被认为是idempotent,但并非必须如此。您可以将GET 中的参数传递给对数据进行永久更改的服务器脚本。相反,POST 被认为是幂等的,但您可以将POST 用于不对服务器进行任何更改的脚本。所以这是一种错误的二分法,在实践中是不相关的。

此外,如果说GET 在重新加载后不会损害任何东西,那是错误的——当然,如果它调用的脚本和它传递的参数正在进行永久性更改(例如删除数据),它当然可以。 POST也可以!

现在,我们知道POST (到目前为止)更安全,因为它不会暴露正在传递的参数,也不会被缓存。另外,您可以传递更多数据,并且您GET 是一个干净、不混淆的 URL。它可以做GET 可以做的所有事情。所以它只是更好。至少在生产中。

那么在实践中,什么时候应该使用GETPOST?我在开发过程中使用GET,所以我可以查看和调整我传递的参数。我用它来快速尝试不同的值(例如测试条件)甚至不同的参数。如果我需要一组不同的参数,我可以做到这一点,而无需构建表单并且不必修改它。我只是根据需要在浏览器中编辑 URL。

一旦开发完成,或者至少稳定,我将所有内容切换到POST

如果您能想到任何技术上的原因表明这是不正确的,我将非常乐意学习。

【讨论】:

【参考方案12】:
    GET 方法用于发送不太敏感的数据,而 POST 方法用于发送敏感数据。 与 GET 方法相比,使用 POST 方法可以发送大量数据。 GET方式发送的数据在浏览器标题栏中可见,POST方式发送的数据不可见。

【讨论】:

【参考方案13】:

如果要从 URL 检索资源,请使用 GET 方法。如果您点击浏览器的后退按钮,您总是可以看到最后一页,并且它可能会被添加到书签中,因此它不如 POST 方法安全。

如果您想向 URL '提交'某些东西,请使用 POST 方法。例如你想创建一个谷歌账户,你可能需要填写所有详细信息,然后你点击“提交”按钮(这里调用POST方法),一旦你提交成功,然后尝试点击浏览器的返回按钮,您将收到错误或新的空白表格,而不是填写表格的最后一页。

【讨论】:

【参考方案14】:
+------------+---------------------------------------+---------------------------------------+
|            | GET                                   | POST                                  |
+------------+---------------------------------------+---------------------------------------+
|BACK button | Harmless                              | Data will be re-submitted             |
| /Reload    |                                       | (the browser should alert             |
|            |                                       | the user that the data are            |
|            |                                       |  about to be re-submitted)            |
+------------+---------------------------------------+---------------------------------------+
|Bookmarked  | Can be bookmarked                     | Cannot be bookmarked                  |
+------------+---------------------------------------+---------------------------------------+
|Cached      | Can be cached                         | Not cached                            |
+------------+---------------------------------------+---------------------------------------+
|Encoding    | application/x-www-form-urlencoded     | application/x-www-form-urlencoded     |
| type       |                                       | multipart/form-data.                  |
|            |                                       | Use multipart encoding for binary data|
+------------+---------------------------------------+---------------------------------------+
|History     | Parameters remain                     | Parameters are                        |
|            |  in browser history                   | not saved in browser history          |
+------------+---------------------------------------+---------------------------------------+
|Restrictions| Yes, when sending data                | No restrictions                       |
|on          |the GET method adds the data to the URL|                                       |
|data length |and the length of a URL is limited     |                                       |
|            |(maximum URL length is 2048 characters)|                                       |
+------------+---------------------------------------+---------------------------------------+
|Restrictions| Only ASCII characters                 | No restrictions.                      |
|on data type|                                       |  Binary data is also allowed          |
+------------+---------------------------------------+---------------------------------------+
|Security    | GET is less secure compared to POST   | POST is a little safer                |
|            | because data sent is part of the URL  |  than GET because the parameters      |
|            |                                       |   are not stored in browser history   |
|            | Never use GET when                    |  or in web server logs                |
|            |  sending passwords                    |or in web server logs                  |
|            |  or other sensitive information!      |                                       |
+------------+---------------------------------------+---------------------------------------+
|Visibility  | Data is visible to everyone in the URL| Data is not displayed in the URL      |
+------------+---------------------------------------+---------------------------------------+

【讨论】:

【参考方案15】:

GET 方法:

仅用于发送 256 个字符的日期

使用此方法时,可以在浏览器上看到信息

这是表单使用的默认方法

没有那么安全。


POST 方法:

用于发送无限数据。

使用此方法,在浏览器上看不到信息

您可以明确提及POST 方法

GET方法更安全

它提供了更多高级功能

【讨论】:

"它仅用于发送 256 个字符的日期" — 不正确。 “当使用这种方法时,可以在浏览器上看到信息”——发布数据在浏览器中也是可见的,只是不是很明显。 “它提供了更高级的功能”——比如? 这不是一个非常有用的答案。不正确的信息,例如“它不那么安全”和“提供更高级的功能”,以及 Quentin 提到的其他内容。

以上是关于什么时候应该使用 GET 或 POST 方法?他们之间有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候用get,什么时候用post

RESTful - 我啥时候应该使用 POST 和 GET?

get和post请求方法的区别

HTTP和HTTPS的区别和常见的面试题

客户端是不是应该使用 GET 或 POST 获取 OAuth 2 访问令牌?

GET和POST两种基本请求方法的区别