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

uniapp 中集成 axios 封装request,实现若依权限认证和若依 api方法共用

uniapp 中集成 Axios ,封装request,实现若依权限认证和若以请求方法的直接复用,直接复制若以js中的请求方法到uniapp使用即可

在 Uniapp 开发中,与后端 API 进行交互是至关重要的环节。为了实现更高效、可维护的 API 调用,我们可以集成 Axios 并进行封装,使其能够与若依框架的 API 进行良好的交互和共用 JS 方法。

一、为什么要封装 Axios

  1. 提高可维护性:将与 API 交互的代码封装在一个地方,便于管理和修改。如果 API 的地址、请求头或其他配置发生变化,只需要在封装的代码中进行修改,而不需要在整个项目中逐个查找和修改。
  2. 代码复用:封装后的 API 请求可以在多个页面和组件中重复使用,减少了代码重复,提高了开发效率。
  3. 增强可扩展性:可以方便地添加请求拦截器和响应拦截器,实现诸如添加请求头、处理错误响应、统一的错误处理等功能。

二、具体封装步骤

1. 安装依赖

首先,确保在 Uniapp 项目中安装了axiosaxios-adapter-uniapp。可以通过以下命令进行安装:

npm install axios axios-adapter-uniapp

2. 导入依赖和配置

在项目中创建一个用于封装 Axios 的文件,比如axiosService.js。在这个文件中,导入axiosaxios-adapter-uniapp,并导入项目中的配置文件(如果有)以获取 API 的主机地址等信息。

import axios from "axios";
import axiosAdapterUniapp from 'axios-adapter-uniapp';
import store from "../store";
import { host } from "./config";

3. 创建 Axios 实例

使用axios.create()方法创建一个 Axios 实例,并设置一些基本的配置,如baseURL、请求头、超时时间等。

const request = axios.create({baseURL: host,headers: {'Content-Type': 'application/json;charset=utf-8',},adapter: axiosAdapterUniapp,timeout: 10000,
});

4. 添加请求拦截器

请求拦截器可以在发送请求之前进行一些操作,比如添加请求头中的认证信息。在这个例子中,我们从本地存储中获取token,如果存在token,则将其添加到请求头中。如果没有token,则重定向到登录页面。

request.interceptors.request.use(function (config) {// 发送请求的相关逻辑let token = uni.getStorageSync('My-Token');if (token) {config.headers.Authorization = 'Bearer ' + token;} else {uni.redirectTo({url: "/pages/login/login",});}return config;
}, function (error) {return Promise.reject(error);
});

5. 添加响应拦截器

响应拦截器可以在接收到响应之后进行一些操作,比如处理错误响应。在这个例子中,如果响应的状态码是 401(认证失败),则重定向到登录页面。如果响应出现错误,则打印错误信息并返回一个 Promise 错误对象。

request.interceptors.response.use(res => {if (res.data.code === "401") {console.log("认证失败");uni.redirectTo({url: "/pages/login/login",});}return res.data;
}, error => {console.log("获取失败");console.log(error);return Promise.reject(new Error('faile'));
});

6. 对外暴露封装后的请求方法

最后,将封装好的 Axios 实例对外暴露,以便在项目中的其他地方使用。

export default request;

三、使用封装后的request

在 Uniapp 的页面或组件中,可以通过导入封装好的request来进行 API 请求。例如:

import request from "./axiosService.js";// 发送 GET 请求
request.get('/api/users').then(response => {console.log(response);
}).catch(error => {console.error(error);
});// 发送 POST 请求
request.post('/api/users', { name: 'John', age: 30 }).then(response => {console.log(response);
}).catch(error => {console.error(error);
});

通过以上封装,我们可以在 Uniapp 项目中方便地与若依框架的 API 进行交互,实现高效的前后端分离开发。同时,封装后的代码也更加易于维护和扩展,为项目的长期发展提供了保障。

四、案例代码

1. 封装好的request.js文件全部代码如下

import axios from "axios";
import axiosAdapterUniapp from 'axios-adapter-uniapp'
import store from "../store";
import { host } from "./config";// 封装axios构造函数请求 
// 1.先是自定义一个方法名
// 2.然后获取头部token值
// 3.延长器设不设置都可以
const request = axios.create({baseURL: host,headers: {// X-Litemall-Token这个名称就固定这个'Content-Type' : 'application/json;charset=utf-8'},adapter: axiosAdapterUniapp,// 超时(毫秒)timeout: 10000
})// 前端请求拦截器
request.interceptors.request.use(function (config) {// 发送请求的相关逻辑// config:对象  与 axios.defaults 相当// 借助 config 将 localStorage 中的 token 加入请求头let token = uni.getStorageSync('My-Token')// 判断token存在就加入请求头if (token) {config.headers.Authorization = 'Bearer ' + token}else{uni.redirectTo({url:"/pages/login/login"})}// 这里也可以将一些反爬的加密信息加入请求头中的自定义字段中交由后端进行验证 ---------------// todo// ---------------------------------------------------------------------------------return config
}, function (error) {// Do something with request errorreturn Promise.reject(error)
})
// 响应拦截器
// 1.相应上面的请求拦截器的需求
// 2.把上面的请求拦截器的需求全部做到
//TODO 从这里判断,如果返回的是过期则,跳转到登录界面
request.interceptors.response.use(res => {if(res.data.code=="401"){console.log("认证失败");uni.redirectTo({url:"/pages/login/login"})}return res.data
}, error => {console.log("获取失败");console.log(error);return Promise.reject(new Error('faile'))
})// 对外暴露前面创建的构造方法
export default request

2. uniapp中js方法如下(直接复制若依api文件夹下js文件中的方法即可)

import request from '@/utils/request.js' // 查询派车单列表
export function listCar(query) {return request({url: '/car/car/list',method: 'get',params: query})
}

3. 页面使用代码如下

import {listCar } from './api/index.js'listCar({name:'xxx'}).then(res=>{console.log(res);that.carList = res.rows
})

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Leetcode 43. 字符串相乘
  • 两个多边形 贴图
  • 开源 AI 智能名片 S2B2C 商城小程序与正能量融入对社群归属感的影响
  • Python “函数” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业
  • 飞睿智能实时雷达活体探测传感器模块,智能家居静止检测实时感知人员有无
  • PHP 面向对象编程
  • 揭秘高效编程工具的选择与使用
  • 揭秘“隐形杀手”:谐波对医院电网的隐形危害
  • STMCubeMx——C8T6的串口调试、接收与发送
  • android和ios双端应用性能的测试工具
  • 丹摩智算平台体验:AI开发从未如此简单
  • 免费制作证件照的小程序源码
  • Python | Leetcode Python题解之第435题无重叠区间
  • 初识C#(一)
  • node-rtsp-stream、jsmpeg.min.js实现rtsp视频在web端播放
  • 「面试题」如何实现一个圣杯布局?
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • android图片蒙层
  • co.js - 让异步代码同步化
  • emacs初体验
  • ES6系列(二)变量的解构赋值
  • gulp 教程
  • Linux gpio口使用方法
  • Odoo domain写法及运用
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • 一份游戏开发学习路线
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #《AI中文版》V3 第 1 章 概述
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #Linux(帮助手册)
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #预处理和函数的对比以及条件编译
  • $().each和$.each的区别
  • $.each()与$(selector).each()
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (十三)Flask之特殊装饰器详解
  • (四)软件性能测试
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (自适应手机端)行业协会机构网站模板
  • .dwp和.webpart的区别
  • .Net Core 笔试1
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .Net环境下的缓存技术介绍
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
  • [] 与 [[]], -gt 与 > 的比较
  • [AI 大模型] Meta LLaMA-2
  • [Android]使用Git将项目提交到GitHub