Ajax、fetch、axios的区别与优缺点

本文探讨了前端异步请求技术的发展历程,从最初的原生XHR到JqueryAjax的广泛应用,再到fetch和axios的兴起。详细分析了各种技术的使用方法、优缺点及浏览器支持情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

前端的技术发展速度非常的快,异步请求也是其重要的体现之一,从最早的原生XHR,再到JqueryAjax的统治时代,再到近来,fetch、axios等技术也开始出现并大量投入使用。

原生Ajax

Ajax是指一种创建交互式网页应用的网页开发技术,并且可以做到无需重新加载整个网页的情况下,能够更新部分网页,也叫作局部更新。

XMLHttpRequest 对象

使用ajax发送请求是依靠于一个对象,叫XmlHttpRequest对象,通过这个对象我们可以从服务器获取到数据,然后再渲染到我们的页面上。现在几乎所有的浏览器都有这个对象,只有IE7以下的没有,而是通过ActiveXObject这个对象来创建的。XmlHttpRequest对象有一些常见的方法:

方法描述
abort()停止当前请求
getAllResponseHeaders()把HTTP请求的所有响应首部作为键/值对返回
getResponseHeader(“header”)返回指定首部的串值
open(method,url)建立对服务器的调用,还有3个可选参数,是否异步、用户名、密码
send(content)向服务器发送请求
abort()停止当前请求
setRequestHeader(header, value)把指定首部设置为所提供的值。
ajax使用步骤

1.创建XmlHttpRequest对象
2.调用open方法设置基本请求信息
3.设置发送的数据,发送请求
4.注册监听的回调函数
5.拿到返回值,对页面进行更新

ajax的get/post请求

其实get和post的请求方式大致是相同的,下面分别是get和post的示例代码:
get

    <script>
       //步骤一:创建异步对象
       var xhr = new XMLHttpRequest();
       //步骤二:设置请求的基本参数
       xhr.open('get','test.php');
       //步骤三:发送请求
       xhr.send();
       //步骤四:注册onreadystatechange监听事件,只要状态改变就会调用
       xhr.onreadystatechange = function () {
          if (ajax.readyState == 4 && ajax.status == 200) {
           //步骤五 如果能够进到这个判断 说明数据完美到手
           console.log(ajax.responseText);//操作返回内容
           }
       }
    </script>

post

    <script>
        //创建异步对象  
        var xhr = new XMLHttpRequest();
        //设置请求基本信息,并加上请求头
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xhr.open('post', 'test.php' );
        //发送请求
        xhr.send('name=Lan&age=18');
        xhr.onreadystatechange = function () {
            // 这步为判断服务器是否正确响应
          if (xhr.readyState == 4 && xhr.status == 200) {
            console.log(xhr.responseText);
          } 
        };
    </script>

onreadystatechange
这个监听函数是来监听readyState这个状态值得:

状态值描述
0请求还未初始化,还未调用open( )
1请求已建立但未发送,还未调用send( )
2接受原始响应数据,为解析做准备
3正在解析数据,根据响应头部返回的MIME类型把数据转换成能通过responseText等形式存取的格式
4响应完成,数据解析完成
ajax优缺点
优缺点描述
优点局部更新
优点原生支持,不需要任何插件
优点原生支持,不需要任何插件
缺点可能破坏浏览器后退功能
缺点嵌套回调,难以处理

JqueryAjax

其实Jquery的ajax就是在原生的ajax的基础上进行了封装,其实没有太多好说的东西,不过加上了对JSONP的支持,附上例子:

    <script>
        var loginBtn =  document.getElementsByTagName("button")[0];
        loginBtn.onclick = function(){
        
            ajax({
                type:"post",
                url:"test.php",
                data:"name=lan&pwd=123456",
                success:function(data){
                   console.log(data);
                }
            });
        }
    </script>

ajax方法里面需要传入一个对象参数,里面包括了一些常见的参数,其实jquery维护了这么多年了,ajax请求其实已经很方便了,如果非要说有什么缺点的话,就是依然对回调嵌套不方便,然后就是如果为了一个JqueryAjax就引入整个jquery,文件比较大,成本过高。

Fetch

Fetch是ajax非常好的一个替代品,很有可能将来会完全代替ajax的地位。我们先来看下浏览器的支持情况:
Fetch浏览器支持情况
我们可以看到IE浏览器完全不支持Fetch,并且移动端的很多浏览器也不支持Fetch,不过可以使用第三方的ployfill来获得支持。Github.fetch

Fetch写法

不管是原生的Ajax还是Jquery封装的Ajax都有一个问题就在于回调地狱,fetch很友好的解决了这个问题,fetch大概长这个样子:

fetch(...).then(fun2)
          .then(fun3)
          .....
          .catch(fun)

它给人一种同步的流程来书写非同步的操作,成功的解决了回调地狱的问题。Fetch能做到这一点,是因为Fetch API是基于Promise设计的。并且fetch调用非常简单,因为它是挂在BOM上的,属于全局的方法。

Fetch获取数据

我们使用Fetch来获取数据时,会返回给我们一个Pormise对象,我们简单看一下:

    <script>
        fetch("http://www.abc.cn/test")
            .then(Response => {
                console.log(Response);
            })
    </script>

输出如下:
输出
OK就是true,status是200,我们可以看到这里面并没有我们想要的数据,其实数据都在body属性里面,是一种数据流的形式,一般服务器会给我们返回JSON数据的格式,我们可以调用response.json来转化下数据:

    <script>
        fetch("http://www.abc.cn/test")
            .then(Response => Response.json())
            .then(data => {
                console.log(data);
            })
    </script>

处理之后,我们继续.then就可以拿到处理之后的数据了。所以这么来看的话通过Fetch来获取数据是非常简洁简单的。

Fetch发送数据

Fetch发送数据也非常的简单,API长这样:

	fetch(url,options)

第二个参数会传入一个对象来配置请求的信息。下面先看一个例子:

    <script>
        fetch('http://www.mozotech.cn/bangbang/index/user/login', {
          method: 'post',
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
          },
          body: new URLSearchParams([["username", "Lan"],["password", "123456"]]).toString()
        })
        .then(res => {
            console.log(res);
            return res.text();
        })
        .then(data => {
            console.log(data);
        })
    </script>

对传入的参数做个说明:

参数名描述
method请求的方法,默认GET
headers请求的头信息
body请求的内容主体

值得一提的是,fetch默认的post的header是Content-Type:text/plain;charset=UTF-8,不过通常我们的post请求是通过表单的形式提交的。所以我们需要把header修改为:Content-Type:application/x-www-form-urlencoded

Cookie传递

fetch发送请求时,不像XHR,因为它默认是不带上Cookie的,如果站点依赖于维护一个用户会话,可能导致未经认证的请求,所以我们需要手动的把Cookie带上,只需加上 credentials: 'include'即可:

    <script>
        fetch('https://www.abc.com/search', {
            method: 'GET',
            credentials: 'include' // 强制加入Cookie
          })
          .then((res)=>{
            return res.text()
          })
          .then((res)=>{
            console.log(res)
          })
    </script>
Fetch优缺点
优缺点描述
优点解决回调地狱
优点使用起来更加简洁
缺点API 偏底层,需要封装
缺点默认不带Cookie,需要手动添加
缺点浏览器支持情况不是很友好,需要第三方的ployfill

Axios

Vue2.0之后,axios开始受到更多的欢迎了。其实axios也是对原生XHR的一种封装,不过是Promise实现版本。
它是一个用于浏览器和 nodejs 的 HTTP 客户端,符合最新的ES规范。简单看下如何使用即可

    <script>
        axios({
            method: 'post',
            url: '/abc/login',
            data: {
                userName: 'Lan',
                password: '123'
            }
        })
        .then(function (response) {
            console.log(response);
        })
        .catch(function (error) {
            console.log(error);
        });
    </script>

感觉axios算是比较完美的一种方案了,几乎没有什么大的缺点。

总结

其实有这么多种的请求方法和解决方案,总结一下:原生XHR几乎很少开发会用,JqueryAjax属于老当益壮的那种,虽然很老,但是很好用,Fetch是属于初生牛犊,还需要慢慢成长,axios就目前来说,算是非常好的了,无脑使用即可。

<think>好的,我现在需要回答用户关于AJAXFetchAxios哪个更好用以及它们的优缺点的问题。首先,我得理清这三个技术的基本概念它们之间的关系。 AJAX是Asynchronous JavaScript and XML的缩写,它并不是一个具体的API,而是一种使用现有技术(如XMLHttpRequest)实现异步通信的技术方案。用户可能知道AJAX通常XHR(XMLHttpRequest)对象关联,所以这里可能需要明确区分AJAXXHR的区别,避免混淆。 然后是Fetch API,这是现代浏览器原生提供的用于发起网络请求的API,基于Promise设计,替代传统的XHR。Fetch的语法更简洁,但用户可能会遇到一些使用上的陷阱,比如默认不携带cookie,错误处理方式的不同,以及需要手动处理响应体的解析。 接下来是Axios,这是一个第三方库,同样基于Promise,但提供了更多的功能更好的浏览器兼容性。比如自动转换JSON数据、请求取消、拦截器等。需要比较它Fetch的不同之处,特别是在错误处理兼容性方面的优势。 用户问哪个更好用,可能需要根据使用场景来分析。比如,如果需要支持旧版浏览器,或者需要更高级的功能如拦截请求,Axios可能是更好的选择。而如果项目不需要额外依赖,且目标浏览器较新,可能Fetch更合适。AJAX(XHR)由于较为老旧,可能只在维护旧代码时使用。 然后需要列出各自的优缺点AJAX(XHR)的缺点包括回调地狱、较繁琐的API,优点可能是兼容性极好。Fetch的优点在于现代、简洁,基于Promise,但缺点如错误处理、需要手动处理状态码等。Axios则兼具易用性功能,但需要引入外部库。 还需要注意用户可能的误区,比如混淆AJAXXHR,或者认为Fetch可以完全替代Axios。这时候要明确各自的定位,以及适用场景。 最后,总结时应根据不同的需求给出建议,比如简单请求用Fetch,复杂项目用Axios,旧环境用XHR。同时确保回答结构清晰,分点列出优缺点,便于用户理解。</think>以下是对 **AJAX(XHR)**、**Fetch** **Axios** 的对比分析,从优缺点适用场景逐步展开: --- ### 1. **AJAX(基于 XMLHttpRequest)** - **定义**:AJAX 是一种异步通信技术,核心依赖浏览器提供的 `XMLHttpRequest` 对象。 - **优点**: - **兼容性极强**:支持所有主流浏览器(包括旧版 IE)。 - **细粒度控制**:可监控请求进度(如上传/下载)。 - **缺点**: - **回调地狱**:需手动处理异步回调,代码可读性差。 - **API 繁琐**:需手动设置请求头、序列化数据等。 - **原生不支持 Promise**:需自行封装或依赖第三方库。 ```javascript // 示例:传统 AJAX 请求 const xhr = new XMLHttpRequest(); xhr.open("GET", "https://api.example.com/data"); xhr.onload = function() { if (xhr.status === 200) console.log(xhr.response); else console.error("请求失败"); }; xhr.send(); ``` --- ### 2. **Fetch API** - **定义**:现代浏览器原生提供的基于 Promise 的请求 API。 - **优点**: - **语法简洁**:链式调用,天然支持 Promise。 - **更标准化**:遵循现代 Web 标准, Service Worker 集成。 - **流式数据处理**:支持 `ReadableStream` 处理大文件。 - **缺点**: - **默认不处理错误**:HTTP 错误状态码(如 404、500)不会触发 `catch`,需手动判断。 - **需手动解析数据**:如 `response.json()`。 - **无请求取消**:需结合 `AbortController` 实现。 - **兼容性问题**:不支持 IE 及旧版移动浏览器。 ```javascript // 示例:Fetch 请求 fetch("https://api.example.com/data") .then(response => { if (!response.ok) throw new Error("请求失败"); return response.json(); }) .then(data => console.log(data)) .catch(error => console.error(error)); ``` --- ### 3. **Axios** - **定义**:基于 Promise 的第三方 HTTP 客户端库。 - **优点**: - **开箱即用**:自动转换 JSON 数据,统一处理错误(非 2xx 状态码触发 `catch`)。 - **功能丰富**:支持拦截器、请求取消、超时设置、CSRF 防护等。 - **浏览器 & Node.js 通用**:适用于全栈开发。 - **兼容性**:通过 polyfill 支持旧浏览器。 - **缺点**: - **额外依赖**:需安装第三方库(体积约 4KB)。 - **配置稍复杂**:拦截器等高级功能需要学习成本。 ```javascript // 示例:Axios 请求 axios.get("https://api.example.com/data") .then(response => console.log(response.data)) .catch(error => console.error(error)); ``` --- ### 对比总结 | 特性 | AJAX (XHR) | Fetch API | Axios | |--------------------|--------------------|--------------------|--------------------| | **语法简洁性** | ❌ 繁琐 | ✅ 简洁 | ✅ 简洁 | | **错误处理** | ❌ 手动判断状态码 | ❌ 需手动处理 | ✅ 自动触发 catch | | **JSON 解析** | ❌ 手动处理 | ❌ 需调用 `.json()` | ✅ 自动转换 | | **请求取消** | ❌ 不支持 | ✅ 需 AbortController | ✅ 内置支持 | | **兼容性** | ✅ 所有浏览器 | ❌ 不兼容旧浏览器 | ✅ 支持旧浏览器 | | **额外功能** | ❌ 无 | ❌ 有限 | ✅ 拦截器、超时等 | --- ### **如何选择?** 1. **简单场景 & 现代浏览器** → **Fetch API**(减少依赖)。 2. **复杂项目 & 全栈开发** → **Axios**(功能全面,错误处理友好)。 3. **维护旧代码或 IE 兼容** → **AJAX (XHR)**(不得已的选择)。 > **提示**:现代前端框架(如 React/Vue)推荐优先使用 Axios,因其功能完善且社区支持强大。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值