AJAX中的GET和POST有什么区别?

22

在AJAX中为什么会存在GET和POST请求?即使它不影响页面URL,通过GET在AJAX中传递敏感数据有何区别,因为数据并未反映到页面URL中?


2
ж•°жҚ®йҖҡиҝҮGETж–№жі•еҸҚжҳ еңЁйЎөйқўURLдёӯгҖӮдҪҝз”ЁTCP/IPзӣ‘и§ҶеҷЁжҲ–д»…дҪҝз”ЁFirefoxзҡ„Header MonitorжҸ’件жҹҘзңӢжӯЈеңЁеҸ‘з”ҹзҡ„жғ…еҶөгҖӮ - Dan Rosenstark
可能是重复问题:https://dev59.com/vHRB5IYBdhLWcg3wHkPi - trante
9个回答

41

根据您对Web服务的需求,应使用适当的HTTP动词。


处理Collection URI(例如:http://example.com/resources/)时:

GET:列出集合的成员,并提供其成员URI以进行进一步导航。例如,列出所有待售汽车。

PUT:意思是“用另一个集合替换整个集合”。

POST:在集合中创建一个新条目,其中ID由集合自动分配。创建的ID通常作为此操作返回的数据的一部分包含。

DELETE:意思是“删除整个集合”。


处理Member URI(例如:http://example.com/resources/7HOU57Y)时:

GET:检索以适当的MIME类型表示的集合成员的表述。

PUT:更新集合的寻址成员或使用指定的ID创建它。

POST:将寻址成员视为其自己的集合,并创建其新下属。

DELETE:删除集合的寻址成员。


来源:维基百科


1
有人真的关注PUT和DELETE吗? - carl
10
有人真的会使用PUT和DELETE吗? -- 你听说过亚马逊S3吗? - Jason S
3
当定义RESTful web服务时,你确实需要这样做。 - Red3

18

对于GET请求而言,仍然存在URL长度限制。除此之外,服务器可能会针对POST和GET请求进行不同的处理;因此需要能够指定所做的请求。


此外,在开发应用程序时,您可以同时使用这两种请求类型。对于大多数情况来说,“is_ajax”标志已经足够了。最好有这样的选择,而不是没有。 - Vasiliy Stavenko
1
我接受dnl.vssll的答案,因为HTTP或AJAX没有强制实施GET URL长度限制,您可以查看此答案https://dev59.com/pXRA5IYBdhLWcg3w0xfk。它受浏览器/服务器的限制,为什么要限制它真的是一个讨论的重点..因为HTTP是基于文本的,所以浏览器将HTTP请求作为一个整体发送..它包括查询字符串,因此如果没有请求长度的限制(假设理想情况),那么限制查询字符串有什么意义? - Xinus
5
我并没有为了支持长度限制而提出论点,我只是在陈述它的存在,并且你必须考虑到它,因为在进行Web开发时,你真的不能忽视浏览器。但是,嘿,你不需要说明你的接受态度;dnl的回复也很好 =) - David Hedlund
3
在实践中,长度限制是非常有效的一个观点。我完全同意David的看法“不能忽视浏览器的支持”。 - Daniel Vassallo
这比被接受的答案更好。我们是开发人员,而不是柏拉图哲学家;你可以谈论GET的理想形式 - w3标准 - 但这并不能改变一个事实,当你将应用程序实际发布到现实世界中时,你必须处理不完美的浏览器,它们无法正确处理任意长度的URI。 - Colin P. Hill

9

GETPOST 之间的另一个区别是浏览器处理缓存的方式。浏览器不会缓存 POST 响应,但是根据响应头中指定的缓存规则,GET 可能会被缓存。


6

有两个主要原因需要它们:

  1. GET 请求对大小有一些限制;而 POST 则通常可以包含更多信息。

  2. 后端可能期望使用 GETPOST,这取决于其设计方式。如果后端期望使用 GET,我们需要灵活地执行 GET 请求,如果期望使用 POST,我们也需要相应地执行 POST 请求。


6

这只是关于遵守HTTP协议规则的简单介绍。

Get请求 - 调用必须是幂等的。这意味着,如果您多次调用它,将获得相同的结果。它不旨在更改基础数据。您可以在搜索框等场景下使用它。

Post请求 - 调用不是幂等的。允许对基础数据进行更改,因此可能会在创建方法中使用。如果您多次调用它,将创建多个条目。


4
通常情况下,您需要向AJAX脚本发送参数,并根据这些参数返回数据。这类似于具有method="get"或method="post"属性的表单。使用GET方法时,参数将传递到查询字符串中。使用POST方法时,参数将在请求正文中发送。
一般来说,如果您的参数很少且不包含敏感信息,则可以通过GET方法发送它们。对于包含敏感数据(例如密码)或长文本(例如一个8000个字符长的人物传记)的数据,最好使用POST方法发送。

据我所知,GET和POST方法仅在其请求格式上有所不同,因此我认为POST并不比GET更安全。 GET被认为是不安全的,因为参数会反映到URL中,但AJAX可以解决这个问题。此外,所有现代浏览器都不限制我们通过GET请求发送的数据量...从响应中我能看到的唯一可能的解释是AJAX旨在与已经建立的HTTP协议共存...这是合乎逻辑的。 - Xinus
@Xinus:据我所知,浏览器和服务器仍然对URL长度(例如GET)施加了重要的限制,HTTP规范也是如此。你能否提供一个参考来证明它们没有这样做? - T.J. Crowder
1
你是对的。但有些人认为POST比GET更安全的原因是,GET参数可能会存储在各种位置,包括服务器日志和作为URL的浏览器历史记录中。而POST则没有这个问题。 - Salman A
@T.J. Crowder:我在David Hedlund的评论中进行了澄清。 - Xinus
这是我能够理解的唯一答案,没有在我的脑海中产生一堆后续问题。感谢您提供简单明了的澄清。 - eaglei22

1

谢谢。

我主要使用Ajax的GET方法,直到现在都没有遇到任何问题,除了以下情况:

与Firefox和Google Chrome不同,Internet Explorer会缓存GET调用,如果使用相同的GET值。

因此,使用一些间隔时间进行Ajax GET可能会显示相同的结果,除非您为每个Ajax GET使用无关的随机数更改URL。


0

其他人已经涵盖了主要的点(上下文/幂等性和大小),但我会再加一个:加密。如果您正在使用SSL并希望加密输入参数,则需要使用POST。


1
这是不正确的。通过SSL传输的所有数据都是加密的。使用GET与POST没有任何区别。 - Joel L
1
我同意Joel L.的观点。整个通信都是加密的,所以使用了什么方法这个问题就不存在了。 - Xinus

0
当我们在Ajax中使用GET方法时,只发送字段值的内容,而不是内容的格式。例如,在GET方法的情况下,文本区域中的内容仅添加到URL中(没有换行符)。这在POST方法中并非如此。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接