|
|
### 介绍
|
|
|
|
|
|
<br />
|
|
|
|
|
|
微信小程序网络请求工具,包含以下功能:
|
|
|
|
|
|
1. 请求拦截器
|
|
|
2. 响应拦截器
|
|
|
3. 并发请求
|
|
|
4. 本地资源上传等
|
|
|
5. 其他...
|
|
|
|
|
|
<br />
|
|
|
|
|
|
### 安装
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```shell
|
|
|
npm install mina-request
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
> 📌 构建 npm:
|
|
|
>
|
|
|
> 安装包后,需要在微信开发者工具中进行 npm 构建,点击 `工具` ➡️ `构建 npm`
|
|
|
|
|
|
|
|
|
|
|
|
<br />
|
|
|
|
|
|
### 实例
|
|
|
|
|
|
<br />
|
|
|
|
|
|
#### 创建实例
|
|
|
|
|
|
<br />
|
|
|
|
|
|
您可以使用自定义配置新建一个实例
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```js
|
|
|
import WxRequest from 'mina-request'
|
|
|
|
|
|
// 对 WxRequest 进行实例化
|
|
|
const instance = new WxRequest({
|
|
|
baseURL: 'https://some-domain.com/api', // 使用时请换成真实接口
|
|
|
timeout: 1000, // 超时时长
|
|
|
isLoading: false // 是否使用默认的 loading 效果
|
|
|
})
|
|
|
|
|
|
```
|
|
|
|
|
|
<br />
|
|
|
|
|
|
#### 实例方法
|
|
|
|
|
|
<br />
|
|
|
|
|
|
以下是可用的实例方法。指定的配置将与实例的配置合并。
|
|
|
|
|
|
> 📌config 对象属性值和 wx.request() 方法调用时传递的参数保持一致
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```js
|
|
|
instance.request(config)
|
|
|
instance.get(url, data, config)
|
|
|
instance.delete(url, data, config)
|
|
|
instance.post(url, data, config)
|
|
|
instance.put(url, data, config)
|
|
|
instance.all(...promise) // 传入一个个 Promise 即可
|
|
|
instance.upload(url, filePath, name, config) // 将本地资源上传到服务器
|
|
|
|
|
|
```
|
|
|
|
|
|
<br />
|
|
|
|
|
|
#### 代码示例
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```js
|
|
|
// request 实例方法
|
|
|
instance.request({
|
|
|
url: '/path',
|
|
|
method: 'POST'
|
|
|
})
|
|
|
|
|
|
// get 实例方法
|
|
|
|
|
|
// 不需要请求参数,也不需要自定义请求配置
|
|
|
instance.get('/path')
|
|
|
|
|
|
// 不需要自定义请求配置
|
|
|
instance.get('/path', { id: 123 })
|
|
|
|
|
|
// 需要请求参数,也需要自定义请求配置
|
|
|
instance.get('/path', { id: 123 }, { timeout: 15000 })
|
|
|
|
|
|
// 不需要请求参数,但需要自定义请求配置
|
|
|
instance.get('/path', null, { timeout: 15000 })
|
|
|
|
|
|
// delete、post、put 方法同上
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<br />
|
|
|
|
|
|
### 请求配置
|
|
|
|
|
|
<br />
|
|
|
|
|
|
这些是创建请求时可以用的配置选项。如果没有指定 `method`,请求将默认使用 `GET` 方法。
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```js
|
|
|
{
|
|
|
baseURL: '', // 请求基准路径,方便进行接口的统一管理
|
|
|
url: '', // 是用于请求的服务器 URL
|
|
|
method: 'GET', // method是创建请求时使用的方法,默认值是 GET
|
|
|
headers: {}, // 请求头
|
|
|
data: {}, // 请求参数
|
|
|
timeout: 60000, // 默认的超时时长,小程序默认的超时时长是 1 分钟
|
|
|
isLoading: true // 控制是否使用默认的 loading,默认值是 true 表示使用默认的 loading
|
|
|
|
|
|
// ... 📌 其他属性值和 wx.request() 方法调用时传递的参数保持一致
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<br />
|
|
|
|
|
|
### 默认配置
|
|
|
|
|
|
<br />
|
|
|
|
|
|
您可以指定默认配置,它将作用于每个请求。
|
|
|
|
|
|
<br />
|
|
|
|
|
|
#### 全局默认值
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```js
|
|
|
instance.defaults.baseURL = 'https://some-domain.com/api/'
|
|
|
instance.defaults.header['token'] = token
|
|
|
instance.defaults.isLoading = fasle
|
|
|
|
|
|
```
|
|
|
|
|
|
<br />
|
|
|
|
|
|
#### 自定义实例默认值
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```js
|
|
|
// 创建实例时配置默认值
|
|
|
const instance = new WxRequest({
|
|
|
baseURL: 'https://some-domain.com/api/'
|
|
|
})
|
|
|
|
|
|
// 创建实例后修改默认值
|
|
|
instance.defaults.header['token'] = token
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<br />
|
|
|
|
|
|
#### 配置的优先级
|
|
|
|
|
|
<br />
|
|
|
|
|
|
实例方法配置(2) > 创建实例时配置项(1) > 默认配置(0)
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```js
|
|
|
// 默认配置,优先级 0
|
|
|
{
|
|
|
timeout: 60000 // 默认的超时时长,小程序默认的超时时长是 1 分钟
|
|
|
}
|
|
|
|
|
|
// 创建实例时配置项,优先级 1
|
|
|
const instance = new WxRequest({
|
|
|
timeout = 2500
|
|
|
})
|
|
|
|
|
|
// 调用实例方法,优先级 2
|
|
|
instance.get('/path', null, {
|
|
|
timeout: 5000
|
|
|
})
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<br />
|
|
|
|
|
|
### 拦截器
|
|
|
|
|
|
<br />
|
|
|
|
|
|
在请求之前新增、修改参数,在响应以后进行逻辑判断、处理
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```js
|
|
|
// 添加请求拦截器
|
|
|
instance.interceptors.request = (config) => {
|
|
|
|
|
|
// 在发送请求之前做些什么
|
|
|
return config
|
|
|
}
|
|
|
|
|
|
// 添加响应拦截器
|
|
|
instance.interceptors.response = (response) => {
|
|
|
|
|
|
// response.isSuccess = true,代码执行了 wx.request 的 success 回调函数
|
|
|
// response.isSuccess = false,代码执行了 wx.request 的 fail 回调函数
|
|
|
|
|
|
// response.statusCode // http 响应状态码
|
|
|
|
|
|
// response.config // 网络请求请求参数
|
|
|
|
|
|
// response.data 服务器响应的真正数据
|
|
|
|
|
|
// 对响应数据做点什么
|
|
|
return response
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<br />
|
|
|
|
|
|
### 本地资源上传
|
|
|
|
|
|
<br />
|
|
|
|
|
|
将本地资源上传到服务器.
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```js
|
|
|
/**
|
|
|
* @description upload 实例方法,用来对 wx.uploadFile 进行封装
|
|
|
* @param {*} url 文件的上传地址、接口地址
|
|
|
* @param {*} filePath 要上传的文件资源路径
|
|
|
* @param {*} name 文件对应的 key
|
|
|
* @param {*} config 其他配置项
|
|
|
*/
|
|
|
|
|
|
upload(url, filePath, name = 'file', config = {}) {
|
|
|
return this.request(
|
|
|
Object.assign({ url, filePath, name, method: 'UPLOAD' }, config)
|
|
|
)
|
|
|
}
|
|
|
|
|
|
// 使用示例
|
|
|
await instance.upload('/path', filePath, name, { ... })
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<br />
|
|
|
|
|
|
### 并发请求
|
|
|
|
|
|
<br />
|
|
|
|
|
|
```js
|
|
|
/**
|
|
|
* @description 处理并发请求
|
|
|
* @param {...promise} promise 传入的每一项需要是 Promise
|
|
|
* @returns Promise
|
|
|
*/
|
|
|
all(...promise) {
|
|
|
// 那么展开运算符会将传入的参数转成数组
|
|
|
return Promise.all(promise)
|
|
|
}
|
|
|
|
|
|
// 使用示例
|
|
|
await instance.all(promise1, promise2, promise3)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<br />
|
|
|
|
|
|
### 完整示例
|
|
|
|
|
|
<br />
|
|
|
|
|
|
导入 `mina-request` ,进行网络请求统一配置:
|
|
|
|
|
|
```js
|
|
|
import WxRequest from 'mina-request'
|
|
|
|
|
|
// 对 WxRequest 进行实例化
|
|
|
const instance = new WxRequest({
|
|
|
baseURL: 'https://some-domain.com/api/',
|
|
|
timeout: 15000,
|
|
|
isLoading: false // 不使用默认 loading
|
|
|
})
|
|
|
|
|
|
// 添加请求拦截器
|
|
|
instance.interceptors.request = (config) => {
|
|
|
// 在请求发送之前做点什么……
|
|
|
|
|
|
// 新增请求头
|
|
|
const token = wx.getStorageSync('token')
|
|
|
|
|
|
if (token) {
|
|
|
config.header['token'] = token
|
|
|
}
|
|
|
|
|
|
return config
|
|
|
}
|
|
|
|
|
|
// 添加响应拦截器
|
|
|
instance.interceptors.response = (response) => {
|
|
|
// 对响应数据做点什么
|
|
|
|
|
|
// 从 response 中解构 isSuccess
|
|
|
const { isSuccess, data } = response
|
|
|
|
|
|
// 如果 isSuccess 为 false,说明执行了 fail 回调函数
|
|
|
// 这时候就说明网络异常,需要给用户提示网络异常
|
|
|
if (!isSuccess) {
|
|
|
wx.showToast({
|
|
|
title: '网络异常,请稍后重试 !'
|
|
|
})
|
|
|
|
|
|
return response
|
|
|
}
|
|
|
|
|
|
// 对业务状态码进行
|
|
|
// ...
|
|
|
|
|
|
// 将服务器响应的数据返回
|
|
|
return data
|
|
|
}
|
|
|
|
|
|
|
|
|
export default instance
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
导入实例,使用实例提供的方法:
|
|
|
|
|
|
```js
|
|
|
// 导入封装的 网络请求模块实例
|
|
|
import instance from '../utils/instance'
|
|
|
|
|
|
/**
|
|
|
* @description 用来获取首页轮播图数据
|
|
|
*/
|
|
|
export const reqSwiperData = () => instance.get('/index/findBanner')
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|