uniapp封装全局request请求

在 UniApp 中,uni.request是用于发起网络请求的 API。如果你想封装请求和响应拦截器,以便在发送请求和接收响应时进行一些通用处理(比如设置统一的请求头、处理错误响应等)

1. 创建请求与响应拦截器,合二为一是个便捷的思路

首先,创建一个文件(例如 request.js)位置 utils/request.js,然后定义一个发送请求的函数,并在该函数中加入请求拦截器的逻辑。

javascript 复制代码
// 请求基础配置
const BASE_URL = 'http://mobileback8.hmcs2025.com/mobile'; // 基础 API URL
// 请求队列,用于拦截器
let requestQueue = [];
// 设置请求头
const setRequestHeaders = () => {
  const token = uni.getStorageSync('token');
  if (token) {
    return { Authorization: `Bearer ${token}` };
  }
  return {};
};
// 请求和响应拦截器
const requestAndResponseInterceptor = () => {
  uni.addInterceptor('request', {
    invoke(options) {
      options.header = {
        ...options.header,
        ...setRequestHeaders(),
      };
      requestQueue.push(options);
      return options;
    },
    success(res) {
	  if (res.statusCode === 200) {
		return res.data;
	  } else {
		//handleError(res);
		return Promise.reject(res);
	  }
	},
	fail(err) {
	  uni.showToast({
		title: '网络请求失败',
		icon: 'none',
	  });
	  return Promise.reject(err);
	},
  });
};

// 调用请求拦截器和响应拦截器
requestAndResponseInterceptor();

// 封装网络请求
export const request = (options) => {
  const { url, method = 'GET', data = {}, headers = {} } = options;
  // 合并配置
  const config = {
    url: options.url.startsWith('http') ? options.url : BASE_URL + options.url,
    method: options.method || 'GET',
    data: options.data || {},
    header: {
      'Content-Type': 'application/json',
  	  'Authorization': 'Bearer',
      ...options.header, // 允许自定义header
    },
    timeout: 10000, // 超时时间(ms)
  }
  return new Promise((resolve, reject) => {
    uni.request({
      ...config,
      success: (res) => {
        if (res.statusCode === 200) {
          resolve(res.data); // 请求成功,返回数据
        } else {
          reject(res); // 请求失败,返回错误信息
        }
      },
      fail: (err) => {
        reject(err); // 网络失败,返回错误信息
      },
    });
  });
};

2. 根据不同请求类型,封装POST/GET/DELETE/PUT 等方法,提供更简洁的API

创建一个 http.js文件,位置utils/https.js,内容如下:

javascript 复制代码
import { request } from './request.js'

// 封装GET/POST等方法
export const http = {
  get(url, data, options = {}) {
    return request({
      url,
      method: 'GET',
      data,
      ...options,
    })
  },
  post(url, data, options = {}) {
    return request({
      url,
      method: 'POST',
      data,
      ...options,
    })
  },
  // 其他方法(PUT/DELETE等)
}

3 调用示例

在main.js中

php 复制代码
import { http } from '@/utils/https'
export function createApp() {
  const app = createSSRApp(App)
  
  // 全局注册组件
  app.component('custom-tabbar', CustomTabbar)
  app.config.globalProperties.$http = http // 全局可用(this.$http),注意:在组件中需要使用this.$http
  // 状态管理
  app.use(store)
  app.use(Pinia.createPinia())
  
  // 全局属性
  app.config.globalProperties.$adpid = "1111111111"
  app.config.globalProperties.$backgroundAudioData = {
    playing: false,
    playTime: 0,
    formatedPlayTime: '00:00:00'
  }

  return {
    app,
    Vuex,
    Pinia
  }
}

在业务组件中调用封装好的http api,部分代码片段如下

javascript 复制代码
// 发起请求
const fetchData = async () => {
  try {
    const res = await proxy.$http.post(API_URLS.USER.LOGIN, { userName: 'adminDev',
      password: '123456' })
    console.log('请求成功:', res)
  } catch (err) {
    console.error('请求失败:', err)
  }
}

onMounted(() => {
  fetchData()
})
相关推荐
m0_7190841144 分钟前
React笔记张天禹
前端·笔记·react.js
Ziky学习记录1 小时前
从零到实战:React Router 学习与总结
前端·学习·react.js
wuhen_n1 小时前
JavaScript链表与双向链表实现:理解数组与链表的差异
前端·javascript
wuhen_n1 小时前
JavaScript数据结构深度解析:栈、队列与树的实现与应用
前端·javascript
狗哥哥1 小时前
微前端路由设计方案 & 子应用管理保活
前端·架构
前端大卫2 小时前
Vue3 + Element-Plus 自定义虚拟表格滚动实现方案【附源码】
前端
却尘2 小时前
Next.js 请求最佳实践 - vercel 2026一月发布指南
前端·react.js·next.js
ccnocare2 小时前
浅浅看一下设计模式
前端
Lee川2 小时前
🎬 从标签到屏幕:揭秘现代网页构建与适配之道
前端·面试
Ticnix3 小时前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts