Appearance
http-client 多端通用网络请求库
Http-client 是 axios 网络请求客户端的封装,主要目的:
- 简化步骤: 只需要
init即可初始化,useHttp处理实际请求 - 多端一致: 支持
h5,小程序等多个端,api 一致,无心智负担 - 无业务依赖: 可插拔配置,去除跨声内部的重业务依赖,去除 vant 组件库的 toast 提示
- ts 类型友好: 支持
ts类型提示,response类型推导
一丶目录结构

二丶基础用法
1. 依赖
ts
pnpm add @mid-vue/http-client2. 导入
ts
import Http from '@mid-vue/http-client'3. 初始化实例
暴露 init 静态方法,传入请求配置(完整的参数见末尾),初始化实例
ts
//main.ts
Http.init({
//baseURL: '/router/rest', 如果接口是代理跨域,直接写死baseURL
baseURL: import.meta.env.VITE_BASE_API, //不同环境baseURL
appkey: import.meta.env.VITE_BASE_APP_KEY,
//去掉内置ks_token,减少耦合
token: () => getToken(),
//不内置toast,传入业务组件toast即可
showErrorMsg: (msg) => showToast(msg),
//添加是否灰度标识,可选的,非必须
isGray: () => getGray(),
})4. 拦截器 -(灰度和 token 失效处理)
ts
//main.ts
Http.init({
//拦截器
interceptors: {
request: [
(req: HttpRequestConfig) => {
//请求拦截,判断是否灰度,并添加header
req.headers.isGray = isGray() ? '1' : '0'
return req
},
],
response: [defaultInterceptors().response],
rejectResponse: (res: HttpResponse) => {
if ([60010, 100201].includes(res?.data?.code)) {
//token失效
//处理token失效的逻辑
}
return Promise.reject(res)
},
},
// 其他配置
baseURL: import.meta.env.VITE_BASE_API, //不同环境baseURL
xxx,
})4. 代码使用
暴露 useHttp方法,方便快捷调用,默认post请求
ts
// api.ts
import { useHttp } from '@mid-vue/http-client'
/**
* 获取用户信息
*/
export const apiGetUserInfo = (data = {}) => {
return useHttp<IUserInfo>({
url: 'mv.driver.activityScheme.getUserInfo',
data,
})
}三丶其他实例函数
1. useRequest 通用请求函数
ts
useRequest<IUserInfo>({
method:'POST|GET|PUT'
url: 'mv.driver.activityScheme.getUserInfo',
data,
})2. 具体实例函数调用
ts
Http.instance.post({
method:'POST|GET|PUT'
url: 'mv.driver.activityScheme.getUserInfo',
data,
})
Http.instance.GET({
method:'POST|GET|PUT'
url: 'mv.driver.activityScheme.getUserInfo',
data,
})四丶更多配置
集成axios的通用功能,添加loading,ignoreToast等特色配置
1. ignoreToast 忽略错误提示
ts
//相同配置,实例会覆盖全局的
useHttp<IUserInfo>({
//错误码为10010时,不自动提示Toast
ignoreToast: [10010],
url: 'mv.driver.activityScheme.getUserInfo',
data,
})
useHttp<IUserInfo>({
//所有错误code不提示Toast
ignoreToast: true,
url: 'mv.driver.activityScheme.getUserInfo',
data,
})2.详情配置
ts
//应用唯一的appkey
appkey?: string | number
/**
* token,可以是个函数
*/
token?: string | (() => string)
/** userId ,可以是函数 */
userId?: string | (() => string)
/** 菜单id */
menuId?: string
// 是否开启loading
loading?: boolean
/**
* loading配置
*/
loadingOption?: {
show: () => void
hide: () => void
}
/**
* 是否忽略错误提示
*/
ignoreToast?: boolean | Array<number | string>
/**
* 错误提示
* @param msg - 后台返回错误信息
*/
showErrorMsg?: (msg: string) => void
casToken?: boolean
headers: {
appkey: string
method: MethodValueType
'Content-Type': EnumContentType
'content-type'?: EnumContentType
'X-menu-id'?: string
'x-from'?: number | string
'X-associated-system-code'?: string
[key: string]: string | number | undefined
}
interceptors?: Partial<HttpInterceptor>
}