docs: 介绍扩展实例

pull/49/head
zjx0905 2023-04-25 23:02:05 +08:00
parent 1e5809aee3
commit db72446aa1
7 changed files with 302 additions and 12 deletions

View File

@ -113,12 +113,14 @@ function sidebar() {
{ {
text: '进阶', text: '进阶',
items: [ items: [
{ text: '中间件', link: '/advanced/middleware' },
{ text: '请求拦截器', link: '/advanced/request-interceptor' }, { text: '请求拦截器', link: '/advanced/request-interceptor' },
{ text: '响应拦截器', link: '/advanced/response-interceptor' }, { text: '响应拦截器', link: '/advanced/response-interceptor' },
{ text: '取消请求', link: '/advanced/cancel' }, { text: '取消请求', link: '/advanced/cancel' },
{ text: '创建实例', link: '/advanced/instance' }, { text: '创建实例', link: '/advanced/instance' },
{ text: '派生领域', link: '/advanced/fork' }, { text: '扩展实例', link: '/advanced/extend' },
{ text: '平台适配器', link: '/advanced/adapter' }, { text: '平台适配器', link: '/advanced/adapter' },
{ text: '派生领域(即将废弃)', link: '/advanced/fork' },
], ],
collapsed: false, collapsed: false,
}, },

View File

@ -0,0 +1,255 @@
---
title: 扩展实例
---
# {{ $frontmatter.title }}
::: tip {{ $frontmatter.title }}
扩展新的实例,复用拦截器、中间件。
:::
## 扩展实例
可以基于 `axios` 扩展实例,配置项 `baseURL` 传相对地址时会和 `axios.defaults.baseURL` 一起组合成完整的服务端地址。
全局默认配置 `axios.defaults` 和扩展实例时传入的配置 `config` 将会按优先级[合并](/basics/defaults#配置合并策略)成实例默认配置 `instance.defaults`
```ts
import axios from 'axios-miniprogram';
axios.defaults.baseURL = 'https://api.com';
// 相对地址会进行组合
// baseURL 最终结果为 https://api.com/uesr
const instance = axios.extend({
baseURL: 'user',
headers: {
common: {
['Content-Type']: 'application/json',
},
post: {
['Content-Type']: 'application/x-www-form-urlencoded',
},
},
timeout: 1000,
});
// 绝对地址会直接使用
// baseURL 最终结果为 https://api2.com/user
const instance = axios.extend({
baseURL: 'https://api2.com/user',
headers: {
common: {
['Content-Type']: 'application/json',
},
post: {
['Content-Type']: 'application/x-www-form-urlencoded',
},
},
timeout: 1000,
});
```
## 默认配置
可以设置配置项默认值。
```ts
import axios from 'axios-miniprogram';
axios.defaults.baseURL = 'https://api.com';
const instance = axios.extend({
baseURL: 'user',
});
instance.defaults.headers.common['Content-Type'] = 'application/json';
instance.defaults.timeout = 1000;
```
## 添加拦截器
可以添加实例的[请求拦截器](/advanced/request-interceptor)和[响应拦截器](/advanced/response-interceptor)。
```ts
import axios from 'axios-miniprogram';
const instance = axios.extend({
baseURL: 'test',
});
// 请求拦截器
instance.interceptors.request.use(
function (config) {
console.log('instance request');
return config;
},
function (error) {
// 对请求错误做些什么
return Promise.reject(error);
},
);
// 响应拦截器
instance.interceptors.response.use(
function (response) {
console.log('instance response');
return response;
},
function (error) {
// 在 catch 之前做些什么
return Promise.reject(error);
},
);
// instance request -> instance response
instance('/');
```
也可以复用拦截器。
```ts
import axios from 'axios-miniprogram';
axios.defaults.baseURL = 'https://api.com';
const parent = axios.extend({
baseURL: '/parent',
});
const child = parent.extend({
baseURL: '/child',
});
// 请求拦截器
axios.interceptors.request.use(
function (config) {
console.log('axios request');
return config;
},
function (error) {
// 对请求错误做些什么
return Promise.reject(error);
},
);
// 响应拦截器
axios.interceptors.response.use(
function (response) {
console.log('axios response');
return response;
},
function (error) {
// 在 catch 之前做些什么
return Promise.reject(error);
},
);
// axios request -> https://api.com/parent/child/ -> axios response
child('/');
// 请求拦截器
parent.interceptors.request.use(
function (config) {
console.log('parent request');
return config;
},
function (error) {
// 对请求错误做些什么
return Promise.reject(error);
},
);
// 响应拦截器
parent.interceptors.response.use(
function (response) {
console.log('parent response');
return response;
},
function (error) {
// 在 catch 之前做些什么
return Promise.reject(error);
},
);
// axios request -> parent request -> https://api.com/parent/child/ -> parent response -> axios response
child('/');
// 请求拦截器
child.interceptors.request.use(
function (config) {
console.log('child request');
return config;
},
function (error) {
// 对请求错误做些什么
return Promise.reject(error);
},
);
// 响应拦截器
child.interceptors.response.use(
function (response) {
console.log('child response');
return response;
},
function (error) {
// 在 catch 之前做些什么
return Promise.reject(error);
},
);
// axios request -> parent request -> child request -> https://api.com/parent/child/ -> child response -> parent response -> axios response
child('/');
```
## 使用
使用方式和 `axios` 完全一致。
```ts
const instance = axios.extend({
baseURL: 'https://api.com',
});
instance('test')
.then((response) => {
// 请求成功后做些什么
})
.catch((error) => {
// 请求失败后做些什么
});
instance('test', {
method: 'POST',
})
.then((response) => {
// 请求成功后做些什么
})
.catch((error) => {
// 请求失败后做些什么
});
instance({
url: 'test',
method: 'POST',
})
.then((response) => {
// 请求成功后做些什么
})
.catch((error) => {
// 请求失败后做些什么
});
```
也可以使用请求方法简化请求。
- [instance.request(url, config?) | instance.request(config)](/basics/request)
- [instance.options(url, config?)](/method/OPTIONS)
- [instance.get(url, params?, config?)](/method/GET)
- [instance.head(url, params?, config?)](/method/HEAD)
- [instance.post(url, data?, config?)](/method/POST)
- [instance.put(url, data?, config?)](/method/PUT)
- [instance.patch(url, data?, config?)](/method/PATCH)
- [instance.delete(url, params?, config?)](/method/DELETE)
- [instance.trace(url, config?)](/method/TRACE)
- [instance.connect(url, config?)](/method/CONNECT)

View File

@ -8,6 +8,10 @@ title: 派生领域
派生新的领域简化 `URL` 派生新的领域简化 `URL`
::: :::
::: warning 注意
该接口即将废弃,请使用功能更强的[扩展实例](./extend)。
:::
## 派生领域 ## 派生领域
可以基于 `axios` 派生领域,配置项 `baseURL` 传相对地址时会和 `axios.defaults.baseURL` 一起组合成完整的服务端地址。 可以基于 `axios` 派生领域,配置项 `baseURL` 传相对地址时会和 `axios.defaults.baseURL` 一起组合成完整的服务端地址。

View File

@ -6,7 +6,6 @@ title: 创建实例
::: tip {{ $frontmatter.title }} ::: tip {{ $frontmatter.title }}
创建新的实例。 创建新的实例。
::: :::
## 创建实例 ## 创建实例
@ -83,25 +82,25 @@ instance.interceptors.response.use(
); );
``` ```
## 派生领域 ## 扩展实例
可以基于实例[派生领域](/advanced/fork)。 可以基于实例[扩展实例](/advanced/extend)。
实例默认配置 `instance.defaults` 和派生领域时传入的配置 `config` 将会按优先级[合并](/basics/defaults#配置合并策略)成领域默认配置 `domain.defaults`。 实例默认配置 `parent.defaults` 和派生领域时传入的配置 `config` 将会按优先级[合并](/basics/defaults#配置合并策略)成新实例默认配置 `child.defaults`。
```ts ```ts
import axios from 'axios-miniprogram'; import axios from 'axios-miniprogram';
const instance = axios.create({ const parent = axios.create({
baseURL: 'https://api2.com', baseURL: 'https://api2.com',
}); });
const domain = instance.fork({ const child = instance.extend({
baseURL: 'user', baseURL: 'user',
}); });
// 请求的服务端地址 https://api2.com/uesr // 请求的服务端地址 https://api2.com/uesr
domain.get('/'); child('/');
``` ```
## 使用 ## 使用
@ -109,8 +108,10 @@ domain.get('/');
使用方式和 `axios` 完全一致。 使用方式和 `axios` 完全一致。
```ts ```ts
import axios from 'axios-miniprogram';
const instance = axios.create({ const instance = axios.create({
baseURL: 'https://api2.com', baseURL: 'https://api.com',
}); });
instance('test') instance('test')

View File

@ -0,0 +1,30 @@
---
title: 中间件
---
# {{ $frontmatter.title }}
::: tip {{ $frontmatter.title }}
洋葱模型中间件。
:::
```ts
import axios from 'axios-miniprogram';
axios.use(async (ctx, next) => {
console.log('start1');
await next();
console.log('end1');
});
axios.use(async (ctx, next) => {
console.log('start2');
await next();
console.log('end2');
});
// start1 -> start2 -> /test -> end2 -> end1
axios('/test');
```
未完待续。。。

View File

@ -1,4 +1,3 @@
import { combineURL } from '../helpers/combineURL';
import { isString } from '../helpers/isTypes'; import { isString } from '../helpers/isTypes';
import { dispatchRequest } from '../request/dispatchRequest'; import { dispatchRequest } from '../request/dispatchRequest';
import { CancelToken } from '../request/cancel'; import { CancelToken } from '../request/cancel';

View File

@ -1,6 +1,5 @@
import { assert } from '../helpers/error'; import { assert } from '../helpers/error';
import { combineURL } from '../helpers/combineURL'; import { isFunction } from '../helpers/isTypes';
import { isFunction, isString } from '../helpers/isTypes';
import { AxiosRequestConfig, AxiosResponse } from './Axios'; import { AxiosRequestConfig, AxiosResponse } from './Axios';
export interface MiddlewareNext { export interface MiddlewareNext {