当前位置:网站首页 > 技术博客 > 正文

ajax请求异常怎么处理



廖雪峰
资深软件开发工程师,业余马拉松选手。

AJAX不是JavaScript的规范,它只是一个哥们“发明”的缩写:Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求。

如果仔细观察一个Form的提交,你就会发现,一旦用户点击“Submit”按钮,表单开始提交,浏览器就会刷新页面,然后在新页面里告诉你操作是成功了还是失败了。如果不幸由于网络太慢或者其他原因,就会得到一个404页面。

这就是Web的运作原理:一次HTTP请求对应一个页面。

如果要让用户留在当前页面中,同时发出新的HTTP请求,就必须用JavaScript发送这个新请求,接收到数据后,再用JavaScript更新页面,这样一来,用户就感觉自己仍然停留在当前页面,但是数据却可以不断地更新。

最早大规模使用AJAX的就是Gmail,Gmail的页面在首次加载后,剩下的所有数据都依赖于AJAX来更新。

用JavaScript写一个完整的AJAX代码并不复杂,但是需要注意:AJAX请求是异步执行的,也就是说,要通过回调函数获得响应。

在现代浏览器上写AJAX主要依靠对象,如果不考虑早期浏览器的兼容性问题,现代浏览器还提供了原生支持的Fetch API,以Promise方式提供。使用Fetch API发送HTTP请求代码如下:

使用Fetch API配合async写法,代码更加简单。

Fetch API的详细用法可以参考MDN文档。

上面代码的URL使用的是相对路径。如果你把它改为,再运行,肯定报错。在Chrome的控制台里,还可以看到错误信息。

这是因为浏览器的同源策略导致的。默认情况下,JavaScript在发送AJAX请求时,URL的域名必须和当前页面完全一致。

完全一致的意思是,域名要相同(和不同),协议要相同(和不同),端口号要相同(http默认是端口,它和就不同)。有的浏览器口子松一点,允许端口不同,大多数浏览器都会严格遵守这个限制。

那是不是用JavaScript无法请求外域(就是其他网站)的URL了呢?方法还是有的,大概有这么几种:

一是通过Flash插件发送HTTP请求,这种方式可以绕过浏览器的安全限制,但必须安装Flash,并且跟Flash交互。不过Flash用起来麻烦,而且现在用得也越来越少了。

二是通过在同源域名下架设一个代理服务器来转发,JavaScript负责把请求发送到代理服务器:

代理服务器再把结果返回,这样就遵守了浏览器的同源策略。这种方式麻烦之处在于需要服务器端额外做开发。

第三种方式称为JSONP,它有个限制,只能用GET请求,并且要求返回JavaScript。这种方式跨域实际上是利用了浏览器允许跨域引用JavaScript资源:

JSONP通常以函数调用的形式返回,例如,返回JavaScript内容如下:

这样一来,我们如果在页面中先准备好函数,然后给页面动态加一个节点,相当于动态读取外域的JavaScript资源,最后就等着接收回调了。

如果浏览器支持HTML5,那么就可以一劳永逸地使用新的跨域策略:CORS了。

CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源。

了解CORS前,我们先搞明白概念:

Origin表示本域,也就是浏览器当前页面的域。当JavaScript向外域(如sina.com)发起请求后,浏览器收到响应后,首先检查是否包含本域,如果是,则此次跨域请求成功,如果不是,则请求失败,JavaScript将无法获取到响应的任何数据。

用一个图来表示就是:

假设本域是,外域是,只要响应头为,或者是,本次请求就可以成功。

可见,跨域能否成功,取决于对方服务器是否愿意给你设置一个正确的,决定权始终在对方手中。

上面这种跨域请求,称之为“简单请求”。简单请求包括GET、HEAD和POST(POST的Content-Type类型 仅限、和),并且不能出现任何自定义头(例如,),通常能满足90%的需求。

无论你是否需要用JavaScript通过CORS跨域请求资源,你都要了解CORS的原理。最新的浏览器全面支持HTML5。在引用外域资源时,除了JavaScript和CSS外,都要验证CORS。例如,当你引用了某个第三方CDN上的字体文件时:

如果该CDN服务商未正确设置,那么浏览器无法加载字体资源。

对于PUT、DELETE以及其他类型如的POST请求,在发送AJAX请求之前,浏览器会先发送一个请求(称为preflighted请求)到这个URL上,询问目标服务器是否接受:

服务器必须响应并明确指出允许的Method:

浏览器确认服务器响应的头确实包含将要发送的AJAX请求的Method,才会继续发送AJAX,否则,抛出一个错误。

由于以、方式传送JSON格式的数据在REST中很常见,所以要跨域正确处理和请求,服务器端必须正确响应请求。

需要深入了解CORS的童鞋请移步MDN文档和W3C文档。

  • 上一篇: cglib底层实现原理
  • 下一篇: java nio网络编程
  • 版权声明


    相关文章:

  • cglib底层实现原理2025-03-25 17:01:00
  • rgb225,225,0是什么颜色2025-03-25 17:01:00
  • python threadpool2025-03-25 17:01:00
  • data-toggle 菜鸟教程2025-03-25 17:01:00
  • 开窗函数语法2025-03-25 17:01:00
  • java nio网络编程2025-03-25 17:01:00
  • rapiddirect2025-03-25 17:01:00
  • 地理学中尺度的概念2025-03-25 17:01:00
  • “免费的编程自学网站”2025-03-25 17:01:00
  • ubuntu ibus输入不了中文2025-03-25 17:01:00