Ajax 中的 GET 与 POST
Posted
技术标签:
【中文标题】Ajax 中的 GET 与 POST【英文标题】:GET vs POST in Ajax 【发布时间】:2010-10-17 10:50:16 【问题描述】:Ajax 请求的 GET 和 POST 有什么区别?
我看不出这两者有什么区别,除了当我使用 GET 时,参数是在 URL 中发送的,这对我来说并没有什么区别,因为所有请求都是在后台制作,用户没有发现任何区别。
编辑: PUT 和 DELETE 方法有什么用途?
【问题讨论】:
顺便说一句,除了 POST 请求之外,还有 PUT 和 DELETE 请求。你也应该问这些。 对于未来的读者:这里是related question by Fooker a year ago。 这很重要,尤其是在您发送敏感数据时。 【参考方案1】:GET 是为从服务器获取数据而设计的。 POST(以及鲜为人知的朋友 PUT 和 DELETE)专为修改服务器上的数据而设计。
GET 请求绝不应该导致从应用程序中删除数据。如果你有一个链接,你可以点击 GET 来删除数据,然后谷歌爬取你的网站可以点击你所有的“删除”链接。
可以在here 找到规范答案,它引用了 html 2.0 规范:
如果表单的处理是幂等的(即它没有持久的 对状态的可观察到的影响 世界),那么表单方法应该是 得到。许多数据库搜索没有 可见的副作用,使理想 查询表单的应用。
如果与处理表单相关的服务有副作用 (例如,修改一个 数据库或订阅 service),方法应该是 POST。
在您的 AJAX 调用中,您需要使用服务器支持的任何方法。您应该始终设计您的服务器,以便通过 POST/PUT/DELETE 调用修改数据的操作。其他 cmets 有指向 REST 的链接,一般将 C/R/U/D 映射到“POST or PUT”(创建)/GET(读取)/PUT(更新)/DELETE(删除)。
【讨论】:
+1:GET 的基本定义——幂等性。所有更改都必须通过 POST、PUT 和 DELETE 进行。 如果我使用 post 提交表单,我的服务器会给出 403 错误,get 正在工作。我认为这是由于服务器配置。我没有任何访问服务器的权限。如何绕过它? 我同意@S.Lott。 GET 方法的完美且完整的定义。 /拍手。 @KrrishRaj,它可能与跨站点发布有关。看看这个***.com/questions/298745/… 虽然我同意这个定义,但实际上很难实现,因为 GET 太不可信了。 GET 非常适合不经常更改的文件,但对于实际的数据 ajaxing 来说就不如 POST 来更改数据,然后 GET 可以返回以前缓存的数据,而不仅仅是浏览器,因为 ISP 可以缓存 GET 而不会必须尊重任何缓存标头。对于我使用 GET 的文件,但对于数据查询和修改,我总是使用 POST。【参考方案2】:如果您要通过 HTTPS 发送大量数据或敏感数据,则需要使用 POST。如果只是一个简单的参数,我会使用 GET。
GET 请求对可以发送的数据量有限制。我忘记了确切的数字,但如果您发送任何实质性内容,这可能会导致问题。
GET 和 POST 的基本区别在于,在 GET 请求中,参数在 URL 中传递,而在 POST 中,参数包含在消息正文中。
【讨论】:
是的,重要的是要指出与 GET 相关的大小限制,并且它们因客户端和服务器软件而异【参考方案3】:它的 AJAX 与否无关紧要。它与您正在采取的行动有关。我建议遵循REST 的原则。其中对更新、删除等有进一步的规定...
【讨论】:
【参考方案4】:GET 请求更容易在 CSRF(跨站请求伪造)攻击中被利用。即假的 POST 请求需要在用户端启用 javascript,而假的 GET 请求仍然可能仅使用 img、script 标签。
【讨论】:
【参考方案5】:许多网络服务器限制了可作为 URL 一部分传递的数据的长度,因此 GET 请求可能会以难以调试的奇怪方式中断。
此外,大多数服务器软件都会在访问日志中记录 URL,因此如果您在 GET 请求中传递敏感信息(例如密码),这很可能会以明文形式写入磁盘。
从 REST 的角度来看,GET 请求应该没有副作用——它们不应该修改数据。因此,如果您只是通过 ID 获取资源,这是有道理的,但如果您要提交对资源的更改,则应该对 http 动词使用 PUT、POST 或 UPDATE。
【讨论】:
【参考方案6】:两者都用于发送一些数据并使用该数据接收一些响应。
GET:获取服务器中的信息存储。 IE。搜索、推文、个人信息。如果要发送信息,请使用 process.php?name=subroto 获取请求发送请求 所以它基本上通过url发送信息。网址不能处理超过 2083 个字符。那么对于博客文章,你能记住这是不可能的吗?
POST:发布与获取相同的操作。用户注册、用户登录、大数据发送、博文。 如果您需要发送安全信息,请使用 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
【讨论】:
【参考方案7】:首先,一般信息。如果您只读取数据,请使用GET
,如果您更改数据库、txt 文件等内容,请使用POST
。
但问题是,一些浏览器缓存GET
结果。我在 IE7 中遇到了 AJAX
请求的问题,但最后我发现浏览器缓存了 GET
结果。我重新考虑了流程并将我的请求更改为POST
。
所以,如果您不想缓存,请不要使用 GET
。
(当然你可以在 GET 操作中禁用缓存。但我不喜欢它)
【讨论】:
【参考方案8】:关于我,我更喜欢 POST。我保留获取我知道发送的值仅限于我拥有“控制”的数据的事件,例如,检索具有 id 的项目。例如,“getitem?id=123”、“deleteImtem?id=123”、... 对于其他情况,当我有一个可由用户填写的表单时,我更喜欢 POST。
就像 Ryan Smith 所说的,最好使用 POST 来发送大量数据,而在使用其他语言/特殊字符的情况下则不用担心(一般所有专业的 javascript 框架都应该没有任何问题需要处理)有了这个,但我认为使用 POST 的担忧更少)。
在我看来,从 REST 角度来看,您可以将其用于新项目(以保持与整个项目的一致性)。
最后,也许网络中使用的一些程序(URL 记录器(即:查看员工是否在非自动化网站上浪费时间,...)代理,...)或任何其他类型的工具都可以拦截查询。有些人会在报告中显示您使用 GET 发送的参数,将其视为不同的网页。但是在这种情况下,可能不是您的问题,而是从一个项目更改为另一个! ;)
【讨论】:
【参考方案9】:GET
和 POST
之间的区别是相同的,无论您使用的是 Ajax、HTML form
s 还是 curl
。以下是相关定义:
【讨论】:
【参考方案10】:如果您传递的任何参数包含可能在 URL 中弄乱的字符(例如空格),则使用 POST。否则,您可以使用 GET。
一般来说,如果您只是传递一些微小的参数,您会使用 GET。但是对于传递用户提交的信息,例如博客条目、文本等,使用 POST 是一个很好的做法。
还有一些框架完全依赖基于分段的 url(例如 site.com/products/133
而不是 site.com/products.php?id=333
并且这些框架取消设置 GET 变量以确保安全。在这种情况下,您将始终使用 POST。
【讨论】:
以上是关于Ajax 中的 GET 与 POST的主要内容,如果未能解决你的问题,请参考以下文章
Chrome 中的 AJAX 发送选项而不是 GET/POST/PUT/DELETE?