@fx/api-core
注入式 HTTP 请求核心。提供 createHttp(opts) 工厂创建 HTTP 客户端(拦截器、401 刷新、token 注入),所有项目专有行为通过 opts 注入,core 本身不耦合任何 UI / 路由 / 存储,可被任意消费方复用。
@fx/api-admin已转发@fx/api-core的全部导出,消费方通常只需import from "@fx/api-admin"。
createHttp
ts
interface TokenStore {
getAccessToken(): string | null
getRefreshToken(): string | null
setTokens(access: string, refresh: string): void
clearTokens(): void
}
interface HttpOptions {
baseURL?: string
timeout?: number
tokenStore: TokenStore
onError?: (msg: string) => void
onUnauthorized?: () => void
refresh?: (rt: string) => Promise<{ access_token: string; refresh_token: string }>
}
function createHttp(opts: HttpOptions): HttpClient注入项
| 注入项 | 作用 | 消费方按需实现 |
|---|---|---|
tokenStore | token 存取 | secure-ls / localStorage / uni.storage |
onError | 错误提示 | ElMessage / message / uni.showToast |
onUnauthorized | 未授权跳转 | router.push / uni.reLaunch |
refresh | token 刷新 | 用 raw client 调刷新接口 |
内置拦截器
- 请求:注入
Bearertoken - 响应:解包
ApiResponse(code === 0为成功) - 401:自动刷新 token(含并发排队 + 多标签页
supersede接管) - 403:触发
onUnauthorized - 网络层失败(连接被拒/断网/超时,
error.response不存在):提示"无法连接服务器" / "请求超时"(超时按ECONNABORTED识别),且 2 秒时间窗内去重 — 并发请求同时失败只提示一次 - 错误:统一
onError提示
createRawClient
ts
function createRawClient(baseURL?: string, timeout?: number): AxiosInstance无拦截器的原生 axios 实例,用于 refresh / logout 等需绕过 401 拦截器的请求,避免递归触发刷新。
用法
ts
import { createHttp } from "@fx/api-admin"
const http = createHttp({
baseURL: "/api",
tokenStore,
onError: (msg) => console.error(msg),
onUnauthorized: () => location.assign("/login"),
refresh: async (rt) => {
/* 用 raw client 调刷新接口 */
},
})多标签页同步
http.supersede() 是可选能力:浏览器多标签页场景下,监听 storage 事件调用它以接管刷新;uni-app 等无多标签页场景不调用即可,零副作用,不影响 401 刷新等核心功能。
