当前位置: 首页 > news >正文

Vue3+uniapp 封装axios

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 => {// 在发送请求之前做些什么// 例如添加tokenconst 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'})}}})}// 返回带有错误信息的对象,而不是直接rejectreturn {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.statusmessage = `请求错误,状态码:${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 } = userInfoconst res = await login({ username: username.trim(), password })if (res.success) {this.token = res.data.tokenuni.setStorageSync('token', res.data.token)await this.getInfo()}return res},// 获取用户信息async getInfo() {const res = await getInfo()if (res.success) {this.userInfo = res.datauni.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.xdnf.cn/news/421489.html

相关文章:

  • 《猜拳游戏》
  • 深入学习Zookeeper的知识体系
  • 软件测试服务公司分享:国产化适配测试的重要性和关键要素
  • 如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接
  • ios remote debut proxy 怎么开启手机端调试和inspect
  • C++ string数据查找、string数据替换、string子串获取
  • Rollup入门与进阶:为现代Web应用构建超小的打包文件
  • 【23种设计模式】分类结构有哪些?
  • Java——集合基础
  • OpenCV中的光流估计方法详解
  • 前端面试每日三题 - Day 33
  • 深入理解BLP安全模型:信息安全中的“守密者”
  • win部署Jenkins 自动化部署发布后端项目
  • 文件操作: File 类的用法和 InputStream, OutputStream 的用法
  • 构建媲美 ChatGPT 的 AI 交互界面—OpenWebUI
  • 大模型分布式光伏功率预测实现详解
  • Linux—进度条实现
  • 开源网络地图可视化第六章学习指南
  • 【unity游戏开发——编辑器扩展】使用MenuItem自定义菜单栏拓展
  • 【ArcGIS】根据shp范围生成系列等距点:范围外等距点+渔网点(Python全代码)
  • Android之横向滑动列表
  • ETL背景介绍_1:数据孤岛仓库的介绍
  • HTTP和HTTPS模块
  • 【计算机视觉】OpenCV实战项目:基于Tesseract与OpenCV的字符识别系统深度解析
  • Flask+HTML+Jquery 文件上传下载
  • 数据库优化
  • 第一章:HTML基石·现实的骨架
  • 《Effective Python》第2章 字符串和切片操作——深入理解Python 中的字符数据类型(bytes 与 str)的差异
  • ValueError: Caught ValueError in DataLoader worker process 0.
  • Postman启动时检测到版本不匹配错误