Axios 默认使用 XMLHttpRequest 或 Node.js 的 http 模块,这在某些小程序端可能不支持:
- ✅ H5 端:完全支持
- ✅ React Native 端:需要配置适配器
- ❌ 微信/支付宝等小程序端 :不支持 (因为小程序环境没有
XMLHttpRequest)
对于需要在多端使用 Axios 的项目,可以配置适配器:
bash
pnpm install axios @tarojs/taro
js
// utils/axiosAdapter.js
import axios from 'axios'
import Taro from '@tarojs/taro'
// 创建自定义适配器
const taroAdapter = (config) => {
return new Promise((resolve, reject) => {
Taro.request({
url: config.url,
method: config.method?.toUpperCase() || 'GET',
data: config.data || config.params,
header: config.headers,
success: (response) => {
resolve({
data: response.data,
status: response.statusCode,
statusText: 'OK',
headers: response.header,
config: config,
request: null
})
},
fail: (error) => {
reject(error)
}
})
})
}
// 创建 Axios 实例
const instance = axios.create({
adapter: taroAdapter,
baseURL: 'https://api.example.com',
timeout: 10000,
})
// 请求拦截器
instance.interceptors.request.use(
(config) => {
// 添加 token
const token = Taro.getStorageSync('token')
if (token) {
config.headers['Authorization'] = `Bearer ${token}`
}
return config
},
(error) => {
return Promise.reject(error)
}
)
// 响应拦截器
instance.interceptors.response.use(
(response) => {
return response.data
},
(error) => {
// 统一错误处理
Taro.showToast({
title: '请求失败',
icon: 'error'
})
return Promise.reject(error)
}
)
export default instance