jQuery、fetch、axios、XMLHttpRequest Ajax请求比较

一、核心对比表

特性jQuery AJAXfetchaxiosXMLHttpRequest
API 风格回调/链式PromisePromise回调
语法简洁
默认 JSON 解析可自动(dataType)需手动 response.json()自动解析
超时处理内置需配合 AbortController内置有 timeout 属性
拦截器
取消请求abort()AbortControllerCancelTokenabort()
并发请求$.when需手动实现axios.all需手动实现
错误处理统一网络错误 rejectHTTP错误自动 reject需手动判断 status
上传/下载进度支持下载支持(上传不支持)支持支持
跨域支持需后端支持需后端支持需后端支持需后端支持
浏览器兼容性IE6+IE 不支持IE 支持IE6+
体积较大(jQuery库)小(约15KB gzip)
Node.js 支持

二、代码对比

1. jQuery AJAX

$.ajax({
    url: '/api/data',
    type: 'GET',
    dataType: 'json',
    success: function(data) {
        console.log(data);
    },
    error: function(xhr, status, error) {
        console.error(error);
    }
});

2. fetch

fetch('/api/data')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error(error));

3. axios

axios.get('/api/data')
    .then(response => console.log(response.data))
    .catch(error => console.error(error));

4. XMLHttpRequest

var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', true);
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
        var data = JSON.parse(xhr.responseText);
        console.log(data);
    }
};
xhr.send();

三、优缺点总结

jQuery AJAX

  • 优点:语法简单;兼容性极好;与 jQuery 生态无缝集成;自动处理 JSON、表单序列化等。
  • 缺点:需引入整个 jQuery 库(体积大);回调风格不如 Promise 优雅;新项目已不推荐。

fetch

  • 优点:原生支持、语法简洁、基于 Promise,易与 async/await 配合。
  • 缺点:IE 不支持(需 polyfill);超时/取消需额外代码;HTTP 错误需手动处理;上传进度不支持。

axios

  • 优点:语法简洁,自动 JSON 解析,支持拦截器、取消、超时、并发等高级功能;兼容性好;支持 Node.js。
  • 缺点:需引入第三方库;体积略大。

XMLHttpRequest

  • 优点:原生、兼容所有主流浏览器;底层可控。
  • 缺点:API繁琐,需处理多个状态和回调;不支持 Promise;缺少高级功能。

四、场景推荐与选择建议

  • 老项目/IE兼容/已用jQuery:继续用 jQuery AJAX 或 XMLHttpRequest。
  • 现代项目/语法简洁/功能丰富:推荐 axios。
  • 轻量级/无需引入库/只需基本功能:推荐 fetch(注意 IE 不支持)。
  • 底层定制/极致兼容性:原生 XMLHttpRequest。

五、实际开发建议

  • 企业级项目、复杂请求、需要统一处理(如 token、错误、拦截器):优选 axios
  • 个人/小型项目,追求极简:fetch 足够。
  • 需支持 IE 或极致兼容性:jQuery AJAX 或 XMLHttpRequest
  • 新项目不建议再用 jQuery AJAX,除非有历史包袱。

六、总结

  • jQuery AJAX:历史遗留项目用,已不推荐新项目。
  • fetch:现代浏览器主流,语法优雅,适合简单场景。
  • axios:功能最全,适合复杂和企业级项目。
  • XMLHttpRequest:底层原生,了解原理即可,实际开发不推荐直接使用。

七、fetch 简介

fetch 是现代浏览器原生提供的用于发送网络请求的 API,语法简洁、基于 Promise,替代了传统的 XMLHttpRequest。它可以用于 GET、POST、PUT、DELETE 等各种 HTTP 请求。


八、fetch 基本语法

fetch(url, options)
    .then(response => {
        // 处理响应对象
    })
    .catch(error => {
        // 处理错误
    });
  • url:请求地址
  • options:可选参数对象,包含 method、headers、body 等

九、常用参数详解

1. method(请求方法)

fetch('https://api.example.com/data', {
    method: 'POST'
});

2. headers(请求头)

fetch('https://api.example.com/data', {
    headers: {
        'Content-Type': 'application/json'
    }
});

3. body(请求体)

仅适用于如 POST、PUT 等有请求体的方法。

fetch('https://api.example.com/data', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ name: 'Tom', age: 18 })
});

4. credentials(携带 Cookie)

  • 'omit'(默认):不带 cookie
  • 'same-origin':同源带 cookie
  • 'include':跨域也带 cookie
fetch(url, {
    credentials: 'include'
});

十、处理响应数据

fetch 返回的是一个 Promise,resolve 的对象是 Response 实例,需要进一步处理数据:

fetch('https://api.example.com/data')
    .then(response => {
        if (!response.ok) { // 检查 HTTP 状态码
            throw new Error('网络响应不是 2xx');
        }
        return response.json(); // 解析为 JSON
    })
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error('请求失败', error);
    });

常用解析方法:

  • response.json():解析为 JSON
  • response.text():解析为文本
  • response.blob():解析为二进制大对象(如图片、文件)
  • response.formData():解析为表单数据

十一、完整示例

GET 请求

fetch('https://api.example.com/users')
    .then(res => res.json())
    .then(data => {
        console.log(data);
    });

POST 请求

fetch('https://api.example.com/users', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ name: 'Alice' })
})
.then(res => res.json())
.then(data => {
    console.log(data);
});

十二、错误处理

  • fetch 只会在网络错误(如断网)时进入 catch,对于 HTTP 错误(如 404、500),需手动判断 response.ok
  • 推荐统一处理:
fetch('https://api.example.com/data')
    .then(response => {
        if (!response.ok) {
            throw new Error('HTTP 错误:' + response.status);
        }
        return response.json();
    })
    .then(data => { /* ... */ })
    .catch(error => { /* ... */ });

十三、与 XMLHttpRequest 区别

特点fetchXMLHttpRequest
API 风格Promise回调函数
语法简洁
跨域携带 Cookie需设置 credentials需设置 withCredentials
支持取消请求需配合 AbortController直接 abort()
兼容性现代浏览器所有主流浏览器

十四、进阶用法

1. 超时处理

fetch 没有内置超时,可以用 AbortController

const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000);

fetch(url, { signal: controller.signal })
    .then(res => res.json())
    .then(data => console.log(data))
    .catch(err => {
        if (err.name === 'AbortError') {
            console.error('请求超时');
        }
    });

2. 文件上传

const formData = new FormData();
formData.append('file', fileInput.files[0]);

fetch('/upload', {
    method: 'POST',
    body: formData
});

十五、注意事项

  1. fetch 不会自动 reject HTTP 错误(如 404),需手动判断。
  2. 默认不带 cookie,需设置 credentials
  3. 兼容性:IE 不支持 fetch,需 polyfill。
  4. 跨域问题需后端支持 CORS。

十六、总结

  • fetch 是现代前端异步请求的主流方式,语法简洁、易于链式处理。
  • 推荐配合 async/await 使用,代码更清晰。
  • 实际开发中还可使用 axios 等第三方库,功能更丰富。

十七、axios 简介

axios 是一个基于 Promise 的 HTTP 客户端,适用于浏览器和 Node.js。它用于发送异步请求,支持 GET、POST、PUT、DELETE 等常见方法,语法简洁,功能强大,兼容性好。


十八、安装和引入

1. 安装

npm install axios
# 或
yarn add axios

2. 引入

import axios from 'axios';
// 或在浏览器中直接用 <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

十九、基本用法

1. GET 请求

axios.get('https://api.example.com/users')
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        console.error(error);
    });

2. POST 请求

axios.post('https://api.example.com/users', {
    name: 'Alice',
    age: 25
})
.then(response => {
    console.log(response.data);
})
.catch(error => {
    console.error(error);
});

3. 配合 async/await

async function getUsers() {
    try {
        const response = await axios.get('https://api.example.com/users');
        console.log(response.data);
    } catch (error) {
        console.error(error);
    }
}
getUsers();

二十、常用配置项

axios 的请求配置项非常丰富,常用的有:

axios({
    url: 'https://api.example.com/users',
    method: 'post',
    headers: {
        'Authorization': 'Bearer token',
        'Content-Type': 'application/json'
    },
    params: { // GET 查询参数
        id: 123
    },
    data: { // POST/PUT 请求体
        name: 'Bob'
    },
    timeout: 5000, // 超时时间(毫秒)
    withCredentials: true // 跨域携带 cookie
});

二十一、响应结构

axios 的响应对象结构如下:

axios.get(url).then(response => {
    console.log(response.data); // 服务器返回的数据
    console.log(response.status); // HTTP 状态码
    console.log(response.statusText); // 状态文本
    console.log(response.headers); // 响应头
    console.log(response.config); // 请求配置
});

二十二、错误处理

axios 的错误对象结构:

axios.get(url)
    .catch(error => {
        if (error.response) {
            // 服务器返回了错误响应(如 404, 500)
            console.log(error.response.status);
            console.log(error.response.data);
        } else if (error.request) {
            // 请求已发出但没有收到响应
            console.log(error.request);
        } else {
            // 其他错误
            console.log(error.message);
        }
    });

二十三、拦截器

拦截器可在请求发送前或响应到达后做统一处理(如添加 token、统一错误处理)。

1. 请求拦截器

axios.interceptors.request.use(config => {
    // 在发送请求前做些什么
    config.headers.Authorization = 'Bearer token';
    return config;
}, error => {
    // 对请求错误做些什么
    return Promise.reject(error);
});

2. 响应拦截器

axios.interceptors.response.use(response => {
    // 对响应数据做些什么
    return response;
}, error => {
    // 对响应错误做些什么
    return Promise.reject(error);
});

二十四、取消请求

可使用 CancelToken 取消请求:

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
    cancelToken: source.token
})
.catch(function(thrown) {
    if (axios.isCancel(thrown)) {
        console.log('请求取消', thrown.message);
    } else {
        // 处理错误
    }
});

// 取消请求
source.cancel('操作取消请求');

二十五、全局配置

可设置默认配置:

axios.defaults.baseURL = 'https://api.example.com/';
axios.defaults.headers.common['Authorization'] = 'Bearer token';
axios.defaults.timeout = 10000;

二十六、并发请求

可以同时发送多个请求:

axios.all([
    axios.get('/user/1'),
    axios.get('/user/2')
])
.then(axios.spread((res1, res2) => {
    console.log(res1.data, res2.data);
}));

二十七、与 fetch 区别

特点axiosfetch
API 风格PromisePromise
默认 JSON自动解析需手动 response.json()
超时处理内置需配合 AbortController
拦截器
取消请求有(CancelToken)需配合 AbortController
浏览器兼容性IE 支持IE 不支持
错误处理HTTP 错误自动 reject需手动判断 response.ok

二十八、常见场景举例

文件上传

const formData = new FormData();
formData.append('file', fileInput.files[0]);

axios.post('/upload', formData, {
    headers: { 'Content-Type': 'multipart/form-data' }
});

下载文件(blob)

axios.get('/download', { responseType: 'blob' })
    .then(res => {
        const url = window.URL.createObjectURL(res.data);
        const a = document.createElement('a');
        a.href = url;
        a.download = 'file.zip';
        a.click();
    });

二十九、总结

  • axios 用法简单,功能丰富,适合绝大多数前端项目。
  • 推荐配合 async/await 使用,代码更清晰。
  • 支持拦截器、取消、超时、全局配置、并发等高级功能。
  • 对于需要兼容 IE 或有复杂请求需求的项目,axios 是优选。

三十、简介与原理

XMLHttpRequest 是浏览器原生提供的用于与服务器交换数据的对象。它允许你在不重新加载整个页面的情况下,发送 HTTP 请求并接收响应,实现 AJAX 技术的基础。

原理:

  1. 创建 XHR 对象。
  2. 配置请求(方法、地址、是否异步)。
  3. 发送请求。
  4. 监听响应状态变化,处理服务器返回的数据。

三十一、基本用法

1. GET 请求

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true); // true 表示异步
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
        console.log(xhr.responseText); // 响应内容
    }
};
xhr.send();

2. POST 请求

var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.com/data', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
        console.log(xhr.responseText);
    }
};
xhr.send(JSON.stringify({ name: 'Tom', age: 18 }));

三十二、常用属性和方法

属性/方法说明
open(method, url, async)初始化请求方法、地址和是否异步
send(body)发送请求(GET 无 body,POST/PUT 可传数据)
setRequestHeader(key, value)设置请求头
onreadystatechange状态变化时触发的回调函数
readyState请求状态(0-4,见下表)
statusHTTP 响应状态码
responseText响应文本数据
responseXML响应 XML 数据(如果返回的是 XML)
abort()取消请求
timeout超时时间(毫秒)
ontimeout超时回调

readyState 状态值

描述
0未初始化
1已打开(open)
2已发送(send)
3正在接收响应
4响应已完成

三十三、常见场景

  1. 表单异步提交
  2. 局部刷新页面内容
  3. 动态加载数据(如分页、搜索建议)
  4. 文件上传/下载(但较复杂,推荐用 fetch/axios)

三十四、错误处理

xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
        if (xhr.status >= 200 && xhr.status < 300) {
            // 成功
            console.log(xhr.responseText);
        } else {
            // 错误处理
            console.error('请求失败', xhr.status, xhr.statusText);
        }
    }
};

三十五、跨域与安全

  • 同源策略:XHR 默认只能请求同源接口,跨域需服务器支持 CORS(响应头需有 Access-Control-Allow-Origin)。
  • 凭证(Cookie):跨域时需设置 xhr.withCredentials = true,且后端需允许。

三十六、进阶用法

1. 设置超时

xhr.timeout = 5000; // 5秒超时
xhr.ontimeout = function() {
    console.error('请求超时');
};

2. 取消请求

xhr.abort();

3. 监听进度(上传/下载)

xhr.upload.onprogress = function(event) {
    if (event.lengthComputable) {
        var percent = (event.loaded / event.total) * 100;
        console.log('上传进度: ' + percent + '%');
    }
};

三十七、优缺点

优点

  • 浏览器原生支持,兼容性极好(IE6+)。
  • 可自定义请求细节。

缺点

  • API 繁琐,需多步设置和回调。
  • 不基于 Promise,嵌套多易形成回调地狱。
  • 不如 fetch/axios 语法简洁,功能丰富。

三十八、与 fetch/axios 的区别

特点XMLHttpRequestfetchaxios
API 风格回调PromisePromise
语法简洁
默认 JSON 解析需手动 response.json()自动解析
超时处理有 timeout 属性需配合 AbortController内置支持
拦截器
取消请求abort()AbortControllerCancelToken
兼容性全部主流浏览器IE 不支持全部主流浏览器

三十九、总结

  • XMLHttpRequest 是最基础的 AJAX 技术,适合了解原理或兼容旧浏览器的场景。
  • 实际开发推荐使用 fetch 或 axios,代码更简洁且功能更强大。
  • 学会 XHR,有助于理解 AJAX 的底层实现。

创作不易,点赞关注!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值