| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- import type { uniappRequestAdapter } from '@alova/adapter-uniapp'
- import type { IResponse } from './types'
- import AdapterUniapp from '@alova/adapter-uniapp'
- import { createAlova } from 'alova'
- import { createServerTokenAuthentication } from 'alova/client'
- import VueHook from 'alova/vue'
- import { LOGIN_PAGE } from '@/router/config'
- import { ContentTypeEnum, ResultEnum, ShowMessage } from './tools/enum'
- // 配置动态Tag
- export const API_DOMAINS = {
- DEFAULT: import.meta.env.VITE_SERVER_BASEURL,
- SECONDARY: import.meta.env.VITE_SERVER_BASEURL_SECONDARY,
- }
- /**
- * 创建请求实例
- */
- const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication<
- typeof VueHook,
- typeof uniappRequestAdapter
- >({
- refreshTokenOnError: {
- isExpired: (error) => {
- return error.response?.status === ResultEnum.Unauthorized
- },
- handler: async () => {
- try {
- // await authLogin();
- }
- catch (error) {
- // 切换到登录页
- await uni.reLaunch({ url: LOGIN_PAGE })
- throw error
- }
- },
- },
- })
- /**
- * alova 请求实例
- */
- const alovaInstance = createAlova({
- baseURL: API_DOMAINS.DEFAULT,
- ...AdapterUniapp(),
- timeout: 5000,
- statesHook: VueHook,
- beforeRequest: onAuthRequired((method) => {
- // 设置默认 Content-Type
- method.config.headers = {
- ContentType: ContentTypeEnum.JSON,
- Accept: 'application/json, text/plain, */*',
- ...method.config.headers,
- }
- const { config } = method
- const ignoreAuth = !config.meta?.ignoreAuth
- console.log('ignoreAuth===>', ignoreAuth)
- // 处理认证信息 自行处理认证问题
- if (ignoreAuth) {
- const token = 'getToken()'
- if (!token) {
- throw new Error('[请求错误]:未登录')
- }
- // method.config.headers.token = token;
- }
- // 处理动态域名
- if (config.meta?.domain) {
- method.baseURL = config.meta.domain
- console.log('当前域名', method.baseURL)
- }
- }),
- responded: onResponseRefreshToken((response, method) => {
- const { config } = method
- const { requestType } = config
- const {
- statusCode,
- data: rawData,
- errMsg,
- } = response as UniNamespace.RequestSuccessCallbackResult
- // 处理特殊请求类型(上传/下载)
- if (requestType === 'upload' || requestType === 'download') {
- return response
- }
- // 处理 HTTP 状态码错误
- if (statusCode !== 200) {
- const errorMessage = ShowMessage(statusCode) || `HTTP请求错误[${statusCode}]`
- console.error('errorMessage===>', errorMessage)
- uni.showToast({
- title: errorMessage,
- icon: 'error',
- })
- throw new Error(`${errorMessage}:${errMsg}`)
- }
- // 处理业务逻辑错误
- const { code, message, data } = rawData as IResponse
- // 0和200当做成功都很普遍,这里直接兼容两者,见 ResultEnum
- if (code !== ResultEnum.Success0 && code !== ResultEnum.Success200) {
- if (config.meta?.toast !== false) {
- uni.showToast({
- title: message,
- icon: 'none',
- })
- }
- throw new Error(`请求错误[${code}]:${message}`)
- }
- // 处理成功响应,返回业务数据
- return data
- }),
- })
- export const http = alovaInstance
|