fetch、axios和ajax三种网络请求方式详解
fetch
、axios
和 ajax
是三种常用的在前端发送网络请求的方法。它们各有特点和适用场景:
1. Fetch API
fetch
是一个现代的 JavaScript API,用于在浏览器中发起网络请求。它返回一个 Promise
对象,使得异步请求更加简洁和易于管理。
基本用法:
1 | fetch('https://api.example.com/data') |
参数
参数名 | 描述 | 必填 | 示例/选项 |
---|---|---|---|
resource | 请求的URL,可以是相对路径或绝对路径。 | 是 | /path/to/resource |
init | 一个对象,包含了请求的配置选项,如方法、头部、模式、凭据等。 | 否 | { <配置选项> } |
init
对象的配置选项示例:
配置选项 | 描述 | 默认值/示例 |
---|---|---|
method | 请求使用的方法,如GET 、POST 等。 |
GET |
headers | 请求的头信息,是一个对象,例如{ "Content-Type": "application/json" } 。 |
{} |
mode | 请求的模式,如cors 、no-cors 、same-origin 等。 |
cors |
credentials | 请求是否携带凭据,如omit 、same-origin 、include 等。 |
same-origin |
body | 请求的body信息,可以是Blob 、BufferSource 、FormData 、URLSearchParams 、USVString 中的一个。 |
|
cache | 请求的缓存模式,如default 、no-store 、reload 等。 |
default |
示例
GET 请求示例:
1 | fetch('https://api.example.com/data') |
POST 请求示例:
1 | fetch('https://api.example.com/data', { |
错误处理:
fetch
不会在响应状态码为 4xx 或 5xx 时拒绝 Promise,它只会在网络错误或请求无法完成时拒绝。因此,你需要手动检查响应状态:
1 | fetch('https://api.example.com/data') |
注意事项
fetch
不支持上传文件的进度事件,如果你需要这些功能,可以考虑使用XMLHttpRequest
或第三方库。fetch
默认不允许跨域请求,除非你在服务器端设置了适当的 CORS 头部。fetch
返回的Response
对象包含了json()
、text()
、blob()
等方法,用于处理不同类型的响应数据。
特点:
- 基于
Promise
实现,支持异步操作。 - 支持现代的网络功能,如
AbortController
用于取消请求。 - 原生支持流式处理,可以处理大文件。
- 需要手动处理错误和状态码(例如,需要检查
response.ok
)。 - 浏览器原生支持,不需要额外的库。
2. Axios
axios
是一个基于 Promise
的 HTTP 客户端,用于浏览器和 node.js。它提供了更丰富的功能和更简单的 API 来处理 HTTP 请求。
基本用法:
1 | axios.get('https://example.com/data') |
设置全局的 axios 默认值
1 | axios.defaults.baseURL = 'https://api.example.com'; |
注:axios 的 headers的 content-type 默认是 “application/json ”
默认情况下,axios将JavaScript对象序列化为JSON,如果是get请求,对请求参数不用做任何处理,但是如果是post请求,并且Content-Type 为application/x-www-form-urlencoded,需要使用URLSearchParams API格式化请求参数, 否则Content-Type依然是application/json
1 | var params = new URLSearchParams(); |
get请求,以下3中写法完全等价
1 | // 第一种写法 |
post请求,以下2种写法完全等价
1 | // 第一种写法 |
执行多个并发请求
1 | function getUserAccount() { |
创建实例
可以使用自定义配置新建一个 axios 实例
axios.create([config])
1 | var instance = axios.create({ |
配置会以一个优先顺序进行合并,顺序由低到高为
1,在 node_modules/axios/lib/defaults.js 找到的库的默认值
2,实例的 defaults 属性
3,请求的 config 参数
1 | // 使用由库提供的配置的默认值来创建实例 |
拦截器
在请求发出之前或响应被 then 或 catch 处理前拦截它们做预处理。
1 | // 添加请求拦截器 |
可以在稍后移除拦截器:
1 | var myInterceptor = axios.interceptors.request.use(function () {/*...*/}); |
可以为自定义 axios 实例添加拦截器
1 | var instance = axios.create(); |
特点:
- 基于 Promise 实现,支持异步操作。
- 支持请求和响应的拦截。
- 转换请求和响应数据(例如,自动转换 JSON)。
- 客户端支持防御 XSRF。
- 支持请求取消。
- 需要安装额外的库(通过 npm 或 yarn)。
3. jQuery Ajax
ajax
是 jQuery 库提供的一个方法,用于发送异步 HTTP 请求。它是一个较为传统的解决方案,依赖于 jQuery。
其实有两种Ajax,另外一种是使用
XMLHttpRequest
对象来异步地发送和接收数据。这是 Ajax 最初的含义,对于IE7+和其他浏览器,可以直接使用XMLHttpRequest对象,对于IE6及以前的浏览器,使用ActiveXObject对象。当然这种方法太原始了,应该不会有人用了吧???
1 | $.ajax({ |
参数名 | 描述 | 必填 | 默认值/示例 |
---|---|---|---|
url | 规定把请求发送到哪个URL。 | 是 | |
type | 以什么样的方式获取数据,可以是get 或post 。 |
否 | get /post |
contentType | 发送POST 请求的格式。 |
否 | application/x-www-form-urlencoded; charset=UTF-8 |
async | 是否异步执行AJAX 请求。 |
否 | true |
data | 发送的数据,可以是字符串、数组或对象(object)。如果是GET 请求,data将被转换成query附加到URL上;如果是POST 请求,根据contentType把data序列化成合适的格式。 |
否 | |
dataType | 接收的数据格式,可以指定为html 、xml 、json 、text 等。 |
否 | 根据响应的Content-Type猜测 |
success | 执行成功时调用的函数,返回的数据可以作为该函数的参数。 | 否 |
基本用法:
1 | $.ajax({ |
特点:
- 基于回调函数实现,不支持
Promise
。 - 需要依赖 jQuery 库。
- 提供了丰富的配置选项,如
dataType
、contentType
等。 - 支持多种类型的请求和响应处理。
- 由于是基于回调,可能不如 Promise 那样易于管理异步操作。
- 默认不带cookie,使用时需要设置。
- 没有办法检测请求的进度,无法取消或超时处理。
- 针对 mvc 编程,由于近来vue和React的兴起,不符合mvvm前端开发流程
适用场景:
1. Fetch API
fetch 是一个原生的 JavaScript API,适用于如果你想要使用现代的、简洁的 API 进行网络请求时或者处理流式数据或二进制数据时
2. Axios
适用于需要一个易于配置和扩展的 HTTP 客户端时以及拦截请求或响应以处理身份验证、日志记录等任务时。
3. jQuery $.ajax()
适用于使用 jQuery 的旧项目,并且需要进行网络请求时或者在旧的浏览器环境中。
参考文章:
前后端数据交互(六)——ajax 、fetch 和 axios 优缺点及比较-腾讯云开发者社区-腾讯云
javascript - Fetch还是Axios——哪个更适合HTTP请求? - 程序员张张 - SegmentFault 思否