Vue3+uniapp 封装axios

news2025/7/9 0:46:26

1.第一步在项目根目录新建utils文件夹,里边新建两个文件request.js和uni-api-promisify.js

2.request.js 代码 要安装axios

import axios from 'axios'
import { showToast } from '@/utils/uni-api-promisify'

// 创建axios实例
const service = axios.create({
  baseURL: "https://api.buzznewsfull.com",
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    // 例如添加token
    const token = uni.getStorageSync('token')
    if (token) {
      config.headers['Authorization'] = 'Bearer ' + token
    }
    
    // 显示加载中提示
    uni.showLoading({
      title: '加载中...',
      mask: true
    })
    
    // 打印请求参数到控制台
    // console.log('请求配置:', config)
    // console.log('请求URL:', config.url)
    // console.log('请求方法:', config.method)
    
    // 区分显示GET和POST请求的参数
    if (config.method === 'get') {
      // console.log('GET请求参数:', config.params)
      // 打印完整URL,包括查询参数
      const fullUrl = new URL(config.url, config.baseURL)
      if (config.params) {
        Object.entries(config.params).forEach(([key, value]) => {
          fullUrl.searchParams.append(key, value)
        })
      }
      // console.log('完整请求URL:', fullUrl.href)
    } else {
      // console.log('POST请求参数:', config.data)
    }
    
    return config
  },
  error => {
    // 对请求错误做些什么
    // console.log(error)
    uni.hideLoading()
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    uni.hideLoading()
    
    const res = response.data
    
    // 统一处理业务错误
    if (res.code !== 20000) {
      // 显示错误信息
      showToast({
        title: res.message || '操作失败',
        icon: 'none'
      })
      
      // 需要登录的状态码
      const loginRequiredCodes = [50008, 50012, 50014]
      if (loginRequiredCodes.includes(res.code)) {
        // 清除本地存储的用户信息
        uni.removeStorageSync('token')
        uni.removeStorageSync('userInfo')
        
        // 重新登录
        uni.showModal({
          title: '登录失效',
          content: '你已被登出,可以取消继续留在该页面,或者重新登录',
          confirmText: '重新登录',
          success: ({ confirm }) => {
            if (confirm) {
              uni.reLaunch({
                url: '/pages/login/login'
              })
            }
          }
        })
      }
      
      // 返回带有错误信息的对象,而不是直接reject
      return {
        success: false,
        code: res.code,
        message: res.message || '操作失败'
      }
    } else {
      // 业务成功,返回数据
      return {
        success: true,
        code: res.code,
        message: res.message || '操作成功',
        data: res.data
      }
    }
  },
  error => {
    console.log('err' + error)
    uni.hideLoading()
    
    let message = '网络请求失败,请稍后重试'
    if (error.response) {
      const status = error.response.status
      message = `请求错误,状态码:${status}`
    } else if (error.message) {
      message = error.message
    }
    
    showToast({
      title: message,
      icon: 'none'
    })
    
    // 返回错误对象
    return {
      success: false,
      code: -1,
      message: message
    }
  }
)

export default service  

3.uni-api-promisify.js

export const showToast = (options) => {
  return new Promise((resolve, reject) => {
    uni.showToast({
      ...options,
      success: resolve,
      fail: reject
    })
  })
}

export const showModal = (options) => {
  return new Promise((resolve, reject) => {
    uni.showModal({
      ...options,
      success: resolve,
      fail: reject
    })
  })
}

// 可以继续添加其他需要Promise化的API  

4.根目录新建api文件夹,里边新建user.js 放接口

5.注意get请求参数是params 进行参数拼接,post是data在请求体中

import request from '@/utils/request'

/**
 * 登录
 * @param {Object} data - 登录数据
 * @param {string} data.username - 用户名
 * @param {string} data.password - 密码
 */
export function login(data) {
  return request({
    url: '/api/user/login',
    method: 'post',
    data
  })
}

/**
 * 获取用户信息
 */
export function getInfo(params) {
  return request({
    url: '/api/user/info',
    method: 'get',
    params
  })
}

/**
 * 登出
 */
export function logout(data) {
  return request({
    url: '/api/user/logout',
    method: 'post',
    data
  })
}  

6.页面中使用

import { defineStore } from 'pinia'
import { login, getInfo, logout } from '@/api/user'

export const useUserStore = defineStore({
  id: 'user',
  state: () => ({
    token: uni.getStorageSync('token') || '',
    userInfo: JSON.parse(uni.getStorageSync('userInfo') || '{}')
  }),
  actions: {
    // 登录
    async login(userInfo) {
      const { username, password } = userInfo
      const res = await login({ username: username.trim(), password })
      
      if (res.success) {
        this.token = res.data.token
        uni.setStorageSync('token', res.data.token)
        await this.getInfo()
      }
      
      return res
    },
    
    // 获取用户信息
    async getInfo() {
      const res = await getInfo()
      
      if (res.success) {
        this.userInfo = res.data
        uni.setStorageSync('userInfo', JSON.stringify(res.data))
      }
      
      return res
    },
    
    // 登出
    async logout() {
      const res = await logout()
      
      if (res.success || res.code === 50008) {
        this.token = ''
        this.userInfo = {}
        uni.removeStorageSync('token')
        uni.removeStorageSync('userInfo')
      }
      
      return res
    }
  }
})  

6.完成了快去试试吧,整体的文件

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QEMU模拟32位ARM实现自定义系统调用

实现自定义系统调用 如何使用 QEMU 模拟32位 ARM 环境参考:使用Qemu模拟32位ARM系统 修改linux内核源码 使用 linux-4.4.240 源码,下载链接:下载链接 在 arch\arm\include\uapi\asm\unistd.h 文件下新增系统调用 sys_test: /…

MySQL——数据类型表的约束

目录 数据类型 数值类型 tinyint类型 bit类型 float类型 decimal类型 字符类型 char类型 varchar类型 日期和时间类型 选择类型 表的约束 null default comment zerofill primary key auto_increment unique key foreign key 数据类型 在MySQL中的数据类…

# YOLOv2:目标检测的升级之作

YOLOv2:目标检测的升级之作 在目标检测领域,YOLO(You Only Look Once)系列算法以其高效的速度和创新的检测方式受到了广泛关注。今天,我们就来深入探讨一下 YOLOv2,看看它是如何在继承 YOLOv1 的基础上进行…

【爬虫】DrissionPage-1

官网地址:DrissionPage官网 小需求采集,我喜欢,我要学。 1 介绍 这是用python编写的爬虫自动化工具,将Selenium 和 Requests 的功能巧妙地整合在一起,提供了统一又简单的操作接口。开发者可以在浏览器模式&#xff0…

Oracle OCP认证考试考点详解083系列15

题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 71. 第71题: 题目 解析及答案: 关于在 Oracle 18c 及更高版本中基于 Oracle 黄金镜像的安装,以下哪…

部署大模型:解决ollama.service: Failed with result ‘exit-code‘的问题

起因是这样: Loaded: loaded (/etc/systemd/system/ollama.service; disabled; preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Tue 2025-05-13 19:31:19 CST; > Process: 12272 ExecStart/usr/bin/ollama serve (codeexited, status1/FAI…

Spring AI 开发本地deepseek对话快速上手笔记

Spring AI Spring AI是一个旨在推进生成式人工智能应用程序发展的项目,Spring AI的核心目标是提供高度抽象化的组件,作为开发AI应用程序的基础,使得开发者能够以最少的代码改动便捷地交换和优化功能模块‌ 在开发之前先得引入大模型&#xf…

SpringBoot中的拦截器

SpringBoot中的拦截器 Filter 典型场景 全局鉴权/接口耗时统计 WebFilter("/*") public class CostFilter implements Filter {Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {long start System.currentTimeMill…

半小时快速入门Spring AI:使用腾讯云编程助手CodeBuddy 开发简易聊天程序

引言 随着人工智能(AI)技术的飞速发展,越来越多的开发者开始探索如何将AI集成到自己的应用中。人工智能正在迅速改变各行各业的工作方式,从自动化客服到智能推荐系统,AI的应用几乎无处不在。Spring AI作为一种开源框架…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL金融风控分析之风险指标可视化监控实战一、引言二、案例背景三、数据准备(一)数据来源与字段说明(二)数据清洗 四、…

geoserver发布arcgis瓦片地图服务(最新版本)

第一步:下载geoserver服务,进入bin目录启动 需要提前安装好JDK环境,1.8及以上版本 安装完成,页面访问端口,进入控制台界面,默认用户名密码admin/geoserver 第二步:下载地图 破解版全能电子地图下载器&…

多边形,矩形,长方体设置

在cesium中,我们可以通过既有的库来进行对地图的构建 // 向场景中添加一个几何体(立方体) scene.primitives.add(new Cesium.Primitive({// 定义几何体实例geometryInstances: new Cesium.GeometryInstance({// 使用BoxGeometry.fromDimensions方法创建…

(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)

目录 前言: 源代码: product.h product.c fileio.h fileio.c main.c 代码解析: fileio模块(文件(二进制)) 写文件(保存) 函数功能 代码逐行解析 关键知识点 读文…

nRF Connect 下载

官方下载路径 点击,或往下拉 选对应的版本 下载成功,数字代表版本好

基于Arduino的贪吃蛇游戏机

3D 打印迷你贪吃蛇游戏机: 在数字娱乐高度发达的今天,我们常常怀念那些经典的复古游戏。其中,贪吃蛇游戏无疑是许多人童年的记忆。今天,我将带你走进一个有趣的 DIY 项目——3D 打印迷你贪吃蛇游戏机。这个项目不仅能够让你重温经…

【PmHub后端篇】Redis分布式锁:保障PmHub流程状态更新的关键

在分布式系统中,确保数据一致性和操作的正确执行是至关重要的。PmHub项目中,通过集成Redis分布式锁来保障流程状态更新,这是一个非常关键的技术点,以下将详细介绍其原理、实现。 1 本地锁的问题 1.1 常见的本地锁 在Java中&…

Starrocks的主键表涉及到的MOR Delete+Insert更新策略

背景 写这个文章的作用主要是做一些总结和梳理,特别是正对大数据场景下的实时写入更新策略 COW 和 MOR 以及 DeleteInsert 的技术策略的演进, 这也适用于其他大数据的计算存储系统。该文章主要参考了Primary Key table. 分析总结 Starrocks 的主键表主…

《操作系统真象还原》第十四章(2)——文件描述符、文件操作基础函数

文章目录 前言文件描述符简介文件描述符原理文件描述符实现修改thread.h修改thread.c 文件操作相关的基础函数inode操作相关函数文件相关函数编写file.h编写file.c 目录相关函数完善fs/dir.h编写fs/dir.c 路径解析相关函数实现文件检索功能修改fs.h继续完善fs.c makefile 结语 …

EMQX v5.0通过连接器和规则同步数据

1 概述 EMQX数据集成功能,帮助用户将所有的业务数据无需额外编写代码即可快速完成处理与分发。 数据集成能力由连接器和规则两部分组成,用户可以使用数据桥接或 MQTT 主题来接入数据,使用规则处理数据后,再通过数据桥接将数据发…

2. 盒模型/布局模块 - 响应式产品展示页_案例:电商产品网格布局

2. 盒模型/布局模块 - 响应式产品展示页 案例&#xff1a;电商产品网格布局 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">:root {--primary-color…