vp-axios
README in English
基于 axios 进行二次封装,更简单、更统一地使用 axios。
功能列表
- 封装调用方式统一的
GET/POST/PUT/DELETE/FORMDATA
方法 - 自定义接口调用失败时如何处理错误提示(可开关)
- 常见 HTTP 状态码的中英文提示
400/401/403/404/405/413/414/500/502/504
- 封装常用的请求头参数,如公参 pubArg,accessToken,加密操作标识 response-encrypt,sign 签名校验等。
- 封装动态秘钥功能,传入动态秘钥请求地址时,会自动发送动态秘钥请求,并采用接口返回值作为动态秘钥。
- 封装 response-encrypt,request-encrypt 请求头接口加密功能,以及必须加密接口列表,以后统一在该库里维护。
- 封装 returnCode 返回非 1000 时的默认弹窗逻辑,并支持自定义配置。
- 自定义错误处理函数,可以根据状态码指定不同错误类型的自定义操作:如 403 跳转到指定页面
hooks
方法
beforeHook(config)
接口请求前自定义操作:如可以在请求时给页面添加蒙层,加载中效果afterHook(responce/error, isError)
接口返回后自定义操作:如取消 loading 效果、处理返回数据的数据结构等
- 兼容错误信息在
200
请求情况
- 指定获取状态码函数
getResStatus(resData)
,获取 response 中的错误码 - 指定获取错误消息函数
getResErrMsg(resData)
,获取 response 中的错误消息 - 指定获取返回最终数据函数
getResData(resData)
,获取 response 中的返回数据
validateStatus
自主校验接口状态- 配置可取消重复请求
- 在
new VpAxios
实例时,配置cancelDuplicated: true
可开启取消重复的请求 - 在
new VpAxios
实例时,duplicatedKeyFn
函数可配置统一的重复请求的标识 - 在请求时可自定义配置单个请求的重复标识
duplicatedKey
基础用法
安装
npm install -S vp-tools
使用
可以通过以下方法 new
一个 VpAxios 的实例,第一个参数 vpAxiosConfig
为 vp-axios
的配置,第二个参数 axiosConfig
为 axios 官方所支持的配置,官方链接地址 http://www.axios-js.com/zh-cn/docs/
import { VpAxios } from 'vp-tools'
const service = new VpAxios(vpAxiosConfig, axiosConfig)
export const postRequest = (url,data, config = {}) => service.POST(url, data, config)
export const getRequest = (url,params, config = {}) => service.GET(url, params, config)
vpAxiosConfig
支持以下配置:
{
commonStore: {},
getDynamicKeyUrl: '',
keyStr: '',
ivStr: '',
appId: '',
apiList: {},
loadingUrl: require('../assets/loading.gif'),
returnCodeMaps: {
},
tip: true,
tipFn: (message) => {},
errorHandlers: {
},
lang: 'zh-cn',
beforeHook: (config) => {},
afterHook: (responce|error, isError) => {},
getResStatus: (resData) => resData.status,
getResErrMsg: (resData) => resData.message,
getResData: (resData) => resData.data,
cancelDuplicated: false,
duplicatedKeyFn: (config) => `${config.method}${config.url}`
}
VpAxios 实例支持 GET/POST/PUT/DELETE/FORMDATA 实例方法,并且调用方式统一。
目前仅对 GET 和 POST 进行过较为严密的测试,建议在 VpAxios 示例的基础上,封装好对应的$get,$post 方法。
对于$upload 等上传类型的方法,可以通过导出原始 axios 对象的形式,对原有逻辑进行支持,避免大幅改动。
service.GET(path, params, config)
service.POST(path, params, config)
service.PUT(path, params, config)
service.DELETE(path, params, config)
service.FORMDATA(path, params, config)
path
为请求路径;
params
为请求参数,GET/FORMDATA 的参数也不用特殊处理,vp-axios 会统一处理,其中 FORMDATA 的 Content-Type
为 multipart/form-data;charset=UTF-8
config
为 axios 的原始配置 和 新增的 vpConfig
字段用于 VpAxios 调用实例方法时传入配置,后续会介绍
自定义错误提示函数
当接口报错时,我们通常会对错误信息进行提示。VpAxios 提供了统一的方式来处理错误消息。在 VpAxiosConfig 中指定 tipFn(errmsg)
可以指定错误消息的处理方式,指定 tip
(布尔值)可以开关是否执行错误提示。
如下,我们可以将 tipFn
指定为 alert
,则错误信息会使用 alert
函数弹出提醒。
import VpAxios from 'vp-axios'
const service = new VpAxios({
tipFn: (message) => alert(message)
})
实例请求中的 vpConfig 配置说明
disableTip 控制单个请求禁用 tip 错误弹窗
VpAxios 内置了常见 HTTP 错误的中英文提示,如 401
对应 “未授权,请确认是否登录” / “Unauthorized”。可以通过配置中的 lang
指定提示的语言。
有些时候,我们可能想要只针对某个接口禁用 tip,此时可以在调用接口时传入第三个参数,如下,可以禁用该接口发生错误时的错误提示。
service.GET(path, params, {
vpConfig: {
disableTip: true
}
})
noAlertFlag 控制单个请求禁用 returnCode 非 1000 的弹窗。
有些时候,我们可能想要只针对某个接口的 returnCode 无论返回多少,都不弹窗。此时,可以在调用接口时传入第三个参数,如下,只要 http 状态码是 2xx,无论 returnCode 返回多少都不会弹窗。
service.GET(path, params, {
vpConfig: {
noAlertFlag: true,
},
headers: { }
})
preventLoading 控制单个请求禁用 loading 图
有些时候,我们可能想要针对某次请求进行特殊设置:无论何时该请求过程中都不要出现 loading 图。
此时,可以设置 preventLoading 为 true,这样该请求就不会加载 loading 图了。
service.GET(path, params, {
vpConfig: {
preventLoading: true
},
headers: { }
})
isEncrypt 控制单个请求禁用 loading 图
有些时候,我们可能想要针对某次请求的入参进行单独加密。
此时,可以设置 isEncrypt 为 true,这样该请求就不会加载 loading 图了。
service.GET(path, params, {
vpConfig: {
isEncrypt: true
},
headers: { }
})
旧语法兼容
由于山东随身厅等项目中以前有封装过isEncrypt,preventLoading,noAlertFlag等功能,因此针对这些旧语法做了兼容性处理。
即不需要修改这些旧语法,但是这里 不推荐 大家再使用旧语法来书写。
await this.$post('activeSpreadPage/awardRecordQueryByPhone',{phone: this.miniTel},false,true)
await this.$post('activeSpreadPage/awardRecordQueryByPhone',{phone: this.miniTel},true)
await this.$post('activeSpreadPage/awardRecordQueryByPhone',{phone: this.miniTel}, {
isEncrypt: true,
noAlertFlag: true,
preventLoading: true
})
自定义错误处理函数
使用 axios
进行接口请求发生错误时,一般会有两种,一种是 validateStatus
不通过时(默认是 2xx
通过) ,另一种是所有接口错误信息都由 200
状态返回,返回结果中带有固定字段表示,如 errno/errmsg
。
在接口请求的过程中,我们有时会需要对于对某些特殊的错误进行一些额外的操作,如 403
的时候跳转到无权限的错误提示页。
这时候,我们可以在配置中添加相应的错误处理函数errorHandlers
,可以给不同的错误码指定不同的处理函数,并且支持自定义的 errno
。
import VpAxios from 'vp-axios'
const service = new VpAxios({
errorHandlers: {
401: () => {}
403: () => {}
1002: () => {}
},
})
获取原始 axios
对象
如果你现有项目已经使用了 axios
,需要兼容旧的逻辑,可以通过以下方式获取原始 axios
的引用。
import { originalAxios as axios, VpAxios, vpCode } from 'vp-tools'
一份完整的service.js代码
import { VpAxios, originalAxios as axios } from 'vp-tools'
import Vue from 'vue'
import apiList from '@/api'
import { APPID } from './config'
import Store from '@/store'
const commonStore = Store.state.common
const isDev = process.env.NODE_ENV === 'development'
const HOST_NAME = isDev ? '/api' : window.location.origin
export const service = new VpAxios({
apiList,
loginConfigInfo: commonStore,
appId: APPID,
tipFn: (message) => {
Vue.$alert.show({
title: '提示',
text: message,
type: 'tip'
})
},
getResStatus: (resData) => resData.errno,
keyStr: '24ac25e04d9d8e2da25549dc94ecf357',
ivStr: '01234567',
getDynamicKeyUrl: 'mcs/security/manage/app/key/query',
loadingUrl: require('@/assets/images/common/loading.gif')
}, {
baseURL: HOST_NAME,
timeout: 60 * 1000
})
export const postRequest = (url, param, config) => {
return service.POST(url, param, config)
}
export const getRequest = (url, param, config) => {
return service.GET(url, param, config)
}
const newAxios = axios.create({
headers: {
Authorization:
commonStore.configInfo.shareToken || commonStore.configInfo.aesToken || urlParse('aestoken')
}
})
export const $httpImgUpoad = (params, isWChat, url) => {
newAxios.defaults.headers['Authorization'] = commonStore.configInfo.shareToken || commonStore.configInfo.aesToken || urlParse('aestoken')
let urls = url || API.upload.file
return newAxios({
url: isWChat ? API.upload.wxupload : urls,
method: 'post',
data: params
})
}
后面的内容不是那么重要,感兴趣可以了解下。
Hooks
VpAxios 在请求前和请求后都留了钩子,以备需要在这两个时机进行特殊的处理。
-
beforeHook(config) 接口请求前的钩子函数
在接口请求前触发,可以在请求时给页面添加蒙层,加载中效果。config
参数是最后发送请求时的配置。
config 为引用传值,可以对该引用的值进行修改,修改后会影响提交的配置
-
afterHook(responce/error, isError) 接口返回后钩子函数
在接口请求返回后触发,可以进行取消 loading 效果、处理返回的数据结构等操作。其中第一个参数在请求成功时是接口返回的响应response
,在接口失败时,是返回的错误对象。第二个参数标识是否是错误返回。
response 为引用传值,可以对该引用的值进行修改,如对返回的数据结构进行调整
通常我们会在实例化时进行通用的钩子函数定义。但可能存在某些特殊的请求,不需要执行 hooks,这时候我们可以在单独的请求中,指定是否禁用 hooks 以及禁用哪一个 hooks。
service.GET(path, params, { vpConfig: { disableHooks: true } })
service.GET(path, params, { vpConfig: { disableHooks: { before: true } } })
service.GET(path, params, { vpConfig: { disableHooks: { after: true } } })
自定义错误信息及数据的获取
前面提到,接口在返回错误时有两种常见方案,其中一种是全部 200
返回,通过特定字段标识是否是错误,如 errno
表示错误号,非 0 则为错误;errmsg
表示错误信息;data
为返回的数据。这也是 VpAxios 的默认值。
当然,有些时候,接口并非我们预想的这样统一,我们可以通过以下三个函数分别指定如何从 reponse data 中获取上述的三个值。
- getResStatus(resData),获取 response 中的错误码,默认值
(resData) => resData.errno
- getResErrMsg(resData),获取 response 中的错误消息,默认值
(resData) => resData.errmsg
- getResData(resData),获取 response 中的返回数据,默认值
(resData) => resData.data
validateStatus
自主校验接口状态
与 axios
中默认的 validateStatus
配置略有不同,vp-axios
中的默认值为 (status) => status === 0 || (status >= 200 && status < 300)
,主要是兼容了错误码由正确响应返回的情况。这时,status
通常可能为0
,有可能是正确的状态码 2xx
,所以加了一个可以判断的逻辑。特殊情况修改该判断逻辑即可。该配置不影响 axios
中 validateStatus
的判断逻辑,如果两个地方都需要,需要分别指定。
配置可取消重复请求自动
如果开启了取消重复请求,但是没有配置duplicatedKeyFn
和 duplicatedKey
,那么默认的重复请求标识为:${config.method}${config.url}
。如果同时配置了duplicatedKeyFn
和 duplicatedKey
,那么duplicatedKey
的优先级高于duplicatedKeyFn
-
在 new VpAxios
实例时,配置cancelDuplicated: true
可开启取消重复的请求
const vpAxiosConfig = {
cancelDuplicated: true,
};
const service = new VpAxios(vpAxiosConfig);
-
在 new VpAxios
实例时,duplicatedKeyFn
函数可配置统一的重复请求的标识
const vpAxiosConfig = {
cancelDuplicated: true,
duplicatedKeyFn: (config) => {
const { method, url, responseType } = config;
return `${method}${url}${responseType}`;
},
};
const service = new VpAxios(vpAxiosConfig);
-
在请求时的可自定义配置单个请求的重复标识duplicatedKey
service.GET(path, params, { vpConfig: { duplicatedKey: "duplicatedKey" } });