平台适配器
平台适配器
用于支持更多小程序平台或小程序框架。
适配器是一个函数,它可以接收 config
参数。
基本配置
可以接收基本配置。
ts
import axios from 'axios-miniprogram';
axios.defaults.adapter = (config) => {
// 配置项
const {
// 请求类型
// 'request' | 'upload' | 'download'
type,
// 开发者服务器接口地址
url,
// HTTP 请求方法
method,
// 请求参数
params,
// 请求数据
data,
// 请求头
headers,
// 返回的数据格式
dataType,
// 响应的数据类型
responseType,
// 超时时间
timeout,
// 成功的回调
success,
// 失败的回调
fail,
} = config;
};
import axios from 'axios-miniprogram';
axios.defaults.adapter = (config) => {
// 配置项
const {
// 请求类型
// 'request' | 'upload' | 'download'
type,
// 开发者服务器接口地址
url,
// HTTP 请求方法
method,
// 请求参数
params,
// 请求数据
data,
// 请求头
headers,
// 返回的数据格式
dataType,
// 响应的数据类型
responseType,
// 超时时间
timeout,
// 成功的回调
success,
// 失败的回调
fail,
} = config;
};
其他配置
可以接收任意多个其他配置。
ts
import axios from 'axios-miniprogram';
axios.defaults.adapter = (config) => {
const {
// 其他配置
other1,
// 其他配置
other2,
} = config;
};
axios('https://api.com', {
other1: true,
other2: true,
});
import axios from 'axios-miniprogram';
axios.defaults.adapter = (config) => {
const {
// 其他配置
other1,
// 其他配置
other2,
} = config;
};
axios('https://api.com', {
other1: true,
other2: true,
});
实现一个适配器
适配的本质是对配置项进行转换,甚至可以零逻辑完成适配。
这里用适配 uni-app 举例,适配其他平台其实大同小异。
ts
import axios from 'axios-miniprogram';
// 适配器
axios.defaults.adapter = (config) => {
// 可以先看看 config 上都有哪些属性
console.log(config);
// 开始适配不同类型的请求
switch (config.type) {
case 'request':
// 适配数据请求
return uni.request({
url: config.url,
data: config.data,
header: config.headers,
method: config.method,
timeout: config.timeout,
dataType: config.dataType,
responseType: config.responseType,
sslVerify: config.sslVerify,
withCredentials: config.withCredentials,
firstIpv4: config.firstIpv4,
enableHttp2: config.enableHttp2,
enableQuic: config.enableQuic,
enableCache: config.enableCache,
enableHttpDNS: config.enableHttpDNS,
httpDNSServiceId: config.httpDNSServiceId,
enableChunked: config.enableChunked,
forceCellularNetwork: config.forceCellularNetwork,
enableCookie: config.enableCookie,
cloudCache: config.cloudCache,
defer: config.defer,
success: (response) => {
config.success({
// 状态码
// 默认值:200
status: response.statusCode,
// 响应头
// 默认值:{}
headers: response.header,
// 响应数据
data: response.data,
// cookie 列表
cookies: response.cookies,
});
},
fail: (error) => {
config.fail({
// 状态码
// 默认值:400
status: 400,
// 响应头
// 默认值:{}
headers: {},
// 响应数据
// 平台 api 错误 error 通常是一个包含 errMsg 属性的对象
data: error,
});
},
});
case 'upload':
// 适配上传文件
const { files, fileType, file, filePath, name, ...formData } =
config.data;
return uni.uploadFile({
url: config.url,
files,
fileType,
file,
filePath,
name,
formData,
header: config.headers,
timeout: config.timeout,
success: (response) => {
config.success({
// 状态码
// 默认值:200
status: response.statusCode,
// 响应头
// 默认值:{}
headers: response.header,
// 响应数据
data: response.data,
});
},
fail: (error) => {
config.fail({
// 状态码
// 默认值:400
status: 400,
// 响应头
// 默认值:{}
headers: {},
// 响应数据
// 平台 api 错误 error 通常是一个包含 errMsg 属性的对象
data: error,
});
},
});
case 'download':
// 适配下载文件
return uni.downloadFile({
url: config.url,
filePath: config.params?.filePath,
header: config.headers,
timeout: config.timeout,
success: (response) => {
config.success({
// 状态码
// 默认值:200
status: response.statusCode,
// 响应头
// 默认值:{}
headers: response.header,
// 响应数据
data: {
filePath: response.filePath,
tempFilePath: response.tempFilePath,
},
});
},
fail: (error) => {
config.fail({
// 状态码
// 默认值:400
status: 400,
// 响应头
// 默认值:{}
headers: {},
// 响应数据
// 平台 api 错误 error 通常是一个包含 errMsg 属性的对象
data: error,
});
},
});
}
};
import axios from 'axios-miniprogram';
// 适配器
axios.defaults.adapter = (config) => {
// 可以先看看 config 上都有哪些属性
console.log(config);
// 开始适配不同类型的请求
switch (config.type) {
case 'request':
// 适配数据请求
return uni.request({
url: config.url,
data: config.data,
header: config.headers,
method: config.method,
timeout: config.timeout,
dataType: config.dataType,
responseType: config.responseType,
sslVerify: config.sslVerify,
withCredentials: config.withCredentials,
firstIpv4: config.firstIpv4,
enableHttp2: config.enableHttp2,
enableQuic: config.enableQuic,
enableCache: config.enableCache,
enableHttpDNS: config.enableHttpDNS,
httpDNSServiceId: config.httpDNSServiceId,
enableChunked: config.enableChunked,
forceCellularNetwork: config.forceCellularNetwork,
enableCookie: config.enableCookie,
cloudCache: config.cloudCache,
defer: config.defer,
success: (response) => {
config.success({
// 状态码
// 默认值:200
status: response.statusCode,
// 响应头
// 默认值:{}
headers: response.header,
// 响应数据
data: response.data,
// cookie 列表
cookies: response.cookies,
});
},
fail: (error) => {
config.fail({
// 状态码
// 默认值:400
status: 400,
// 响应头
// 默认值:{}
headers: {},
// 响应数据
// 平台 api 错误 error 通常是一个包含 errMsg 属性的对象
data: error,
});
},
});
case 'upload':
// 适配上传文件
const { files, fileType, file, filePath, name, ...formData } =
config.data;
return uni.uploadFile({
url: config.url,
files,
fileType,
file,
filePath,
name,
formData,
header: config.headers,
timeout: config.timeout,
success: (response) => {
config.success({
// 状态码
// 默认值:200
status: response.statusCode,
// 响应头
// 默认值:{}
headers: response.header,
// 响应数据
data: response.data,
});
},
fail: (error) => {
config.fail({
// 状态码
// 默认值:400
status: 400,
// 响应头
// 默认值:{}
headers: {},
// 响应数据
// 平台 api 错误 error 通常是一个包含 errMsg 属性的对象
data: error,
});
},
});
case 'download':
// 适配下载文件
return uni.downloadFile({
url: config.url,
filePath: config.params?.filePath,
header: config.headers,
timeout: config.timeout,
success: (response) => {
config.success({
// 状态码
// 默认值:200
status: response.statusCode,
// 响应头
// 默认值:{}
headers: response.header,
// 响应数据
data: {
filePath: response.filePath,
tempFilePath: response.tempFilePath,
},
});
},
fail: (error) => {
config.fail({
// 状态码
// 默认值:400
status: 400,
// 响应头
// 默认值:{}
headers: {},
// 响应数据
// 平台 api 错误 error 通常是一个包含 errMsg 属性的对象
data: error,
});
},
});
}
};
使用 createAdapter
创建适配器
可以使用 createAdapter
简化适配流程。
直接使用可以完美适配小程序平台,但不能保证完美适配小程序以外的其他平台,如 App、H5。
ts
import axios from 'axios-miniprogram';
axios.defaults.adapter = axios.createAdapter({
request: uni.request,
upload: uni.uploadFile,
download: uni.downloadFile,
});
import axios from 'axios-miniprogram';
axios.defaults.adapter = axios.createAdapter({
request: uni.request,
upload: uni.uploadFile,
download: uni.downloadFile,
});
也可以进一步抹平存在差异的部分,实现完美适配全平台。
ts
import axios from 'axios-miniprogram';
axios.defaults.adapter = axios.createAdapter({
request: uni.request,
upload: (config) => {
// 其实差异只有一点点,抹平可以很轻易~
const {
// 需要上传的文件列表
// App、H5( 2.6.15+)
files,
// 要上传的文件对象
// 仅 H5(2.6.15+)支持
file,
...formData
} = config.formData;
return uni.uploadFile({
...config,
files,
file,
formData,
});
},
download: uni.downloadFile,
});
import axios from 'axios-miniprogram';
axios.defaults.adapter = axios.createAdapter({
request: uni.request,
upload: (config) => {
// 其实差异只有一点点,抹平可以很轻易~
const {
// 需要上传的文件列表
// App、H5( 2.6.15+)
files,
// 要上传的文件对象
// 仅 H5(2.6.15+)支持
file,
...formData
} = config.formData;
return uni.uploadFile({
...config,
files,
file,
formData,
});
},
download: uni.downloadFile,
});