Skip to content

Uniapp Axios Adapter 请求封装

这里不使用 uni.request API,而是使用这个库 axios-adapter

接口封装

request.js

js
import axios from 'axios';
import { createUniAppAxiosAdapter } from '@uni-helper/axios-adapter';

const $request = axios.create({ adapter: createUniAppAxiosAdapter() });

$request.interceptors.request.use((config) => {
  console.log('请求拦截器->', config);
  return config;
});

$request.interceptors.response.use(
  (response) => {
    console.log('响应拦截器->', response);
    return response.data;
  },
  (error) => {
    console.log('响应拦截器错误:', error);
  },
);

export { $request };

useRequest.js

js
import { $request } from '@/request';
import { configInfo } from '@/config';
import { useAuth } from '@/composables/useAuth';

const toRequest = async (options) => {
  const {
    params = null,
    data = null,
    auth = true,
    loading = false,
    loadingText = '加载中...',
    method = 'GET',
    timeout = 10000,
  } = options;

  const baseURL = configInfo.BaseURL;

  const requestHeader = {
    'content-type': 'application/json',
  };

  loading &&
    uni.showLoading({
      title: loadingText,
      mask: true,
    });

  const requestResult = await $request.request({
    url: baseURL,
    headers: requestHeader,
    method,
    params,
    data,
    timeout,
  });

  loading && uni.hideLoading();

  return requestResult;
};

/**
 * useRequest 封装请求(Ajax 请求 + 图片上传)
 * @param {*} url:请求地址
 * @param {*} method:请求方式。默认为GET
 * @param {*} params:请求参数 GET
 * @param {*} data:请求参数 POST
 * @param {*} header:自定义请求头
 * @param {*} auth: 是否需要授权。默认为 true
 * @param {*} loading: 是否展示加载。默认为 false
 * @param {*} loadingText: 是否展示加载。默认为 加载中...
 * @param {*} type: REQUEST | UPLOAD_IMAGE | UPLOAD_VIDEO
 * @param {*} filePath: 图片&视频文件临时路径
 * @returns
 */
export const useRequest = async (options) => {
  const { getAuthStatus, JudgeAuthLogic } = useAuth();

  console.log('options.urlPara:', options.urlPara);

  // 设置了不需要登录就可以访问的接口
  if (options.auth === false) {
    return await toRequest(options);
  }

  // 需要Token的接口需要登录后才能访问时

  // 报错为了防止代码继续执行,避免页面出现错误的交互
  if (!getAuthStatus()) {
    // #ifndef H5
    JudgeAuthLogic({ type: 'COMMON' });
    // #endif

    // #ifdef H5
    H5OpenModal();
    // #endif

    throw new Error('用户未登录');
  } else {
    return await toRequest(options);
  }
};