什么时候应该使用 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 【问题描述】:使用GET
或POST
方法有什么区别?哪个更安全?它们各自有什么(缺点)优点?
(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】:GET
和 POST
是 HTTP 方法,可以实现类似的目标
GET
基本上只是为了获取(检索)数据,GET
不应该有正文,所以除了 cookie,唯一传递信息的地方是 URL,并且 URL 的长度有限,@987654325与POST
相比,@ 的安全性较低,因为发送的数据是 URL 的一部分
发送密码、信用卡或其他敏感信息时切勿使用GET
!,URL 中的数据对所有人可见,可缓存数据。
GET
在我们重新加载或回调按钮时是无害的,它会被标记,参数保留在浏览器历史中,只允许 ASCII 字符。
POST
可能涉及任何事情,例如存储或更新数据、订购产品或发送电子邮件。 POST
方法有一个主体。
POST
方法被保护用于将敏感和机密信息传递给服务器,它不会在 URL 中的查询参数中可见,并且参数不会保存在浏览器历史记录中。数据长度没有限制。当我们重新加载时,浏览器应该提醒用户数据即将被重新提交。 POST
方法无法添加书签
【讨论】:
【参考方案11】:这个问题和other 与GET
和POST
相关的SO 问题中的所有或大部分答案都是错误的。它们在技术上是正确的,并且正确地解释了standards,但实际上它完全不同。让我解释一下:
GET
被认为是idempotent,但并非必须如此。您可以将GET
中的参数传递给对数据进行永久更改的服务器脚本。相反,POST
被认为是非幂等的,但您可以将POST
用于不对服务器进行任何更改的脚本。所以这是一种错误的二分法,在实践中是不相关的。
此外,如果说GET
在重新加载后不会损害任何东西,那是错误的——当然,如果它调用的脚本和它传递的参数正在进行永久性更改(例如删除数据),它当然可以。 POST
也可以!
现在,我们知道POST
(到目前为止)更安全,因为它不会暴露正在传递的参数,也不会被缓存。另外,您可以传递更多数据,并且您GET
是一个干净、不混淆的 URL。它可以做GET
可以做的所有事情。所以它只是更好。至少在生产中。
那么在实践中,什么时候应该使用GET
和POST
?我在开发过程中使用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 方法?他们之间有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章
RESTful - 我啥时候应该使用 POST 和 GET?