Skip to content

@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

注入项

注入项作用消费方按需实现
tokenStoretoken 存取secure-ls / localStorage / uni.storage
onError错误提示ElMessage / message / uni.showToast
onUnauthorized未授权跳转router.push / uni.reLaunch
refreshtoken 刷新用 raw client 调刷新接口

内置拦截器

  • 请求:注入 Bearer token
  • 响应:解包 ApiResponsecode === 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 刷新等核心功能。