180 lines
3.6 KiB
Markdown
180 lines
3.6 KiB
Markdown
用于 uni-app 的 `axios` adapter
|
||
|
||
利用 `axios` params.adapter 增加了 uni-app 的 `uni.request` 和 `uni.uploadFile` 的适配器
|
||
|
||
基于原来的 `xhr.js` adapter 调整而来,保留了中止请求的 `cancelToken` 用法
|
||
|
||
**欢迎 issue 和 pr**
|
||
|
||
## TODO
|
||
|
||
- [ ] examples
|
||
- [ ] 测试用例是模拟的,仅校验了配置数据格式,考虑用 uniapp 接口做测试。 [https://uniapp.dcloud.io/collocation/auto/quick-start](https://uniapp.dcloud.io/collocation/auto/quick-start)
|
||
|
||
## 安装
|
||
|
||
Using npm:
|
||
|
||
`$ npm install axios-adapter-uniapp`
|
||
|
||
Using yarn:
|
||
|
||
`$ yarn add axios-adapter-uniapp`
|
||
|
||
直接引用:
|
||
|
||
去[仓库](https://github.com/lcysgsg/axios-adapter-uniapp)复制
|
||
|
||
## 用法
|
||
|
||
> 就是 axios , 具体看 axios 文档, 这里大概的列一下
|
||
|
||
[axios](https://www.npmjs.com/package/axios)
|
||
|
||
[uniapp request](https://uniapp.dcloud.io/api/request/request)
|
||
|
||
[uniapp network-file](https://uniapp.dcloud.io/api/request/network-file)
|
||
|
||
### 适配了什么
|
||
|
||
- `GET`
|
||
- 兼容了字段 `data`, `data`(优先) 和 `params` 效果相同。
|
||
- `POST`
|
||
- 上传文件,要触发 `uni.uploadFile` 需要满足 2 个条件:
|
||
- `POST`
|
||
- `config.filePath && config.name` 或 `Array.isArray(config.files) && config.files.length > 0`
|
||
- 取消请求,不能支持 uniapp 原先的方法——因为 `Promise`,支持使用 axios CancelToken 的用法
|
||
|
||
### 例子
|
||
|
||
例子都是 `config` 风格, 也是我推荐的(),链式也支持,更多例子可以看根目录下的 `__tests__/index.spec.js`
|
||
|
||
```js
|
||
// '@/common/js/axios/index.js'
|
||
|
||
import axios from 'axios'
|
||
import axiosAdapterUniapp from 'axios-adapter-uniapp'
|
||
|
||
const instance = axios.create({
|
||
baseURL: 'URL.com',
|
||
adapter: axiosAdapterUniapp,
|
||
})
|
||
|
||
// request拦截器
|
||
instance.interceptors.request.use()
|
||
|
||
// respone拦截器
|
||
instance.interceptors.request.use()
|
||
|
||
export default instance
|
||
```
|
||
|
||
`GET`
|
||
|
||
```js
|
||
import axios from '@/common/js/axios/index.js'
|
||
|
||
axios({
|
||
method: 'get',
|
||
url: '/user',
|
||
data: {
|
||
id: 1,
|
||
},
|
||
})
|
||
|
||
axios({
|
||
method: 'get',
|
||
url: '/user',
|
||
params: {
|
||
id: 1,
|
||
},
|
||
})
|
||
|
||
// 两者结果相同 =>
|
||
// URL.com/user?id=1
|
||
```
|
||
|
||
`POST`
|
||
|
||
```js
|
||
import axios from '@/common/js/axios/index.js'
|
||
|
||
axios({
|
||
method: 'post',
|
||
url: '/user',
|
||
data: {
|
||
firstName: 'Fred',
|
||
lastName: 'Flintstone',
|
||
},
|
||
})
|
||
```
|
||
|
||
`UPLOAD`,要触发 `uni.uploadFile` 需要满足 2 个条件:
|
||
|
||
- `POST`
|
||
- `config.filePath && config.name` 或 `Array.isArray(config.files) && config.files.length > 0`
|
||
|
||
```js
|
||
import axios from '@/common/js/axios/index.js'
|
||
|
||
axios({
|
||
method: 'post',
|
||
url: '/avatar',
|
||
filePath: uri,
|
||
name: 'file',
|
||
formData: {
|
||
firstName: 'Fred',
|
||
lastName: 'Flintstone',
|
||
},
|
||
})
|
||
|
||
axios({
|
||
method: 'post',
|
||
url: '/avatar',
|
||
files: [
|
||
// 多文件上传有注意事项的,看uni文档
|
||
{ name: 'file', uri: uri },
|
||
],
|
||
formData: {
|
||
firstName: 'Fred',
|
||
lastName: 'Flintstone',
|
||
},
|
||
})
|
||
```
|
||
|
||
`CancelToken` 取消请求, [https://www.npmjs.com/package/axios#cancellation](https://www.npmjs.com/package/axios#cancellation)
|
||
|
||
```js
|
||
import axios from '@/common/js/axios/index.js'
|
||
|
||
const CancelToken = axios.CancelToken;
|
||
const source = CancelToken.source();
|
||
|
||
axios({
|
||
...,
|
||
cancelToken: source.token
|
||
}).catch(function (thrown) {
|
||
if (axios.isCancel(thrown)) {
|
||
console.log('Request canceled', thrown.message);
|
||
} else {
|
||
// handle error
|
||
}
|
||
});
|
||
|
||
// 或者
|
||
|
||
const CancelToken = axios.CancelToken;
|
||
let cancel;
|
||
|
||
axios({
|
||
...,
|
||
cancelToken: new CancelToken(function executor(c) {
|
||
// An executor function receives a cancel function as a parameter
|
||
cancel = c;
|
||
})
|
||
});
|
||
|
||
// cancel the request
|
||
cancel();
|
||
```
|