GET vs POST在Ajax中


77

是什么区别GETPOSTAjax的请求?

我看不到这两者之间的任何区别,只是当我使用GET时,参数是在URL中发送的,这对我来说并没有任何区别,因为所有请求都是在后台进行的,并且用户找不到任何请求区别。

编辑:什么是PUTDELETE方法?


8
顺便说一句,除了POST请求外,还有PUT和DELETE请求。您也应该问这些。
S.Lott

1
对于未来的读者:这是一年前Fooker的一个相关问题
基甸,2015年

这很重要,尤其是在发送敏感数据时。
biesior

Answers:


136

GET设计用于从服务器获取数据。POST(以及鲜为人知的朋友PUT和DELETE)设计用于修改服务器上的数据。

GET请求绝不应导致从应用程序中删除数据。如果您具有链接,则可以单击GET以删除数据,然后Google抓取您的网站的蜘蛛可以单击您所有的“删除”链接。

可以在此处找到规范答案,该规范引用了HTML 2.0规范:

如果对表单的处理是幂等的(即,对世界的状态没有持久的可观察到的影响),则表单方法应为GET。许多数据库搜索没有明显的副作用,可以理想地应用于查询表单。

如果与表单处理相关的服务有副作用(例如,修改数据库或订阅服务),则该方法应为POST。

在AJAX调用中,您需要使用服务器支持的任何方法。您应该始终设计服务器,以便通过POST / PUT / DELETE调用修改数据的操作。其他注释具有指向REST的链接,该链接通常将C / R / U / D映射到“ POST或PUT”(创建)/ GET(读取)/ PUT(更新)/ DELETE(删除)。


9
+1:GET的基本定义-幂等。所有更改都必须通过POST,PUT和DELETE进行。
S.Lott

如果我使用post提交表单,我的服务器显示403错误,get可以正常工作。我认为这是由于服务器配置。我无权访问服务器。如何解决呢?
Krrish Raj 2015年

我同意@ S.Lott。完全不错的GET方法定义。/拍手
维克多·里贝罗·瓜许

@KrrishRaj,它可能与跨站点发布有关。看看这个stackoverflow.com/questions/298745/...
SRIKANTH

尽管我同意该定义,但实际上很难实现,因为GET是如此不可信。GET非常适合不经常更改的文件,但是对于实际的数据修饰而言,不如POST更改数据那么好,其次是GET可以返回以前缓存的数据,而不仅仅是浏览器,因为ISP可以缓存GET而不能必须遵守任何缓存头。对于文件,我使用GET,但是对于数据查询和修改,我始终使用POST。
拉赫利

26

如果要通过HTTPS发送大量数据或敏感数据,则需要使用POST。如果只是一个简单的参数,我将使用GET。

GET请求对可发送的数据量有限制。我忘记了确切的数字,但是如果您发送的是实质性内容,这可能会导致问题。

基本上,GET和POST之间的区别在于,在GET请求中,参数是在URL中传递的,而在POST中,参数是包含在消息正文中的。


2
是的,重要的是要指出与GET相关的大小限制,并且它们取决于客户端和服务器软件而有所不同
艾伦·赖斯2009年

19

它的AJAX是否无关紧要。关于您要采取的行动。我建议遵循REST的原则。其中有关于更新,删除等的更多规定...


4

GET请求更容易在CSRF(跨站点请求伪造)攻击中利用。也就是说,伪造的POST请求需要在用户端启用Javascript,而伪造的GET请求仍然可以通过img,script标签使用。


3

许多Web服务器都限制了可以作为URL一部分传递的数据的长度,因此GET请求可能会以难以调试的奇怪方式中断。

另外,大多数服务器软件都会在访问日志中记录URL,因此,如果在GET请求中传递敏感信息(例如密码),则很可能会将其以纯文本格式写入磁盘。

从REST的角度来看,GET请求应该没有副作用-它们不应该修改数据。因此,如果仅通过ID获取资源,这是有道理的,但是,如果要提交对资源的更改,则应该对HTTP动词使用PUT,POST或UPDATE。


3

两者都用于发送一些数据并使用该数据接收一些响应。

GET:获取服务器中的信息存储。就是 搜索,鸣叫,人员信息。如果要发送信息,则使用process.php?name = subroto获取请求发送请求,因此它基本上是通过url发送信息。网址最多只能处理2083个字符。因此,对于博客帖子,您还记得这是不可能的吗?

开机自检:开机自检与获取相同。用户注册,用户登录,大数据发送,博客文章。如果您需要发送安全信息,请使用post或大数据,因为它们不会通过url。

AJAX:$ .get()和$ .post()包含的功能是$ .ajax()的子集。它有很多配置。

$ .get()方法,这是$ .Ajax()的一种简写形式。使用$ .get()时,您无需传递对象,而可以传递参数。至少,您需要前两个参数,这是您要检索的文件的URL(即“ test.txt”)和成功回调。

概要:

$.get( url [, data ] [, success ] [, dataType ] )
$.post( url [, data ] [, success ] [, dataType ] ) // for sending secure or Large information
$.ajax( url [, settings ] )  // More Configaration

2

首先,一般信息。使用GET,如果你只读取数据,使用POST,如果你想改变什么数据库,txt文件等。

但是问题是,某些浏览器会缓存GET结果。我AJAX在IE7中遇到了请求问题,但最后我发现浏览器缓存了GET结果。我重新考虑了流程,并将请求更改为POST

因此,GET如果您不想缓存,请不要使用。

(当然,您可以禁用GET操作中的缓存。但是我不喜欢它)


1

关于我,我更喜欢POST。我保留获取事件的信息,我知道发送的值限于我拥有“控制权”的数据,例如,检索带有ID的项目。例如,“ getitem?id = 123”,“ deleteImtem?id = 123”,...对于其他情况,当我有一个可由用户填写的表单时,我更喜欢POST。

就像Ryan Smith所说的那样,最好使用POST发送大量数据,而在使用其他语言/特殊字符的情况下则要少一些麻烦(通常所有专业javascript框架都应该没有任何问题可以解决,但是我认为使用POST的担心更少。

从REST的角度来看,我认为您可以将其用于新项目(以保持与整个项目的一致性)。

最后,也许网络中使用的某些程序(URL记录器(即:查看员工是否在非自定义站点上丢失了时间,...)代理,...)或任何其他类型的工具都可以拦截查询。有人会在报告中显示您使用GET发送的参数,将其视为不同的网页。但是在这种情况下,这可能不是您的问题,而是从一个项目更改为另一个项目!;)



-2

如果传递的任何参数都带有可能在URL中弄乱的字符(例如空格),请使用POST。否则,您可以使用GET。

通常,如果只传递一些小参数,则可以使用GET。但是对于传递用户提交的信息(例如博客条目,文本等),使用POST是一个好习惯。

也有某些框架完全依赖于基于段的url(例如site.com/products/133而不是,site.com/products.php?id=333并且这些框架未设置GET变量以确保安全。在这种情况下,您将始终使用POST。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.