第一章: uniapp引入axios异步框架

news2024/10/7 6:39:43

第一章: uniapp引入axios异步框架

在学习uniapp的过程中,发现uniapp框架默认集成request请求框架存在问题,发送请求时在header中塞入token值,而后台接收不到,也就是说uniapp默认的request请求框架,不支持在请求头中放入token的做法。
基于以上原因,笔者确定放弃默认的请求框架,引入第三方axios请求框架。

那么该怎么说呢?默认三步骤:一引入,二配置,三测试

第一步、引入axios组件

这里笔者使用的npm工具安装axios组件,同时指定版本,如果不指定版本默认会安装最新版本,最新版本的axios组件在真机测试阶段会出现请求不适配的问题,这里先按下不谈,后续文章会说明情况。

npm i axios@0.27.2

第二步、创建并配置axios.js

注意:一定要配置axios.defaults.adapter 来适配uniapp框架。
同时在请求和响应拦截中,对token进行设置和获取操作,在前后端分离的项目中以token作为用户请求后台的唯一合法依据。

import Vue from 'vue'
import axios from 'axios'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';

const service = axios.create({
	baseURL: "http://127.0.0.1:7777/",
	timeout: 6000,
})

// 请求拦截
service.interceptors.request.use(config => {
		// 非登录接口添加token
		if (config["url"].indexOf("login") < 0) {
			config.headers['token'] = uni.getStorageSync('token');
		}
		return config;
	},
	error => {
		return Promise.reject(error);
	});

// 响应拦截
service.interceptors.response.use(res => {
	if (res.status == 200) {
		// 请求成功后设置token
		if (res.data.code == 100) {
			uni.setStorageSync('token', res.header["token"]);
		}
		return res.data;
	} else {
		return Promise.reject(res.data.msg);
	}
});


// 自定义适配器 , 适配uniapp语法
axios.defaults.adapter = function(config) {
	return new Promise((resolve, reject) => {
		let settle = require('axios/lib/core/settle');
		let buildURL = require('axios/lib/helpers/buildURL');
		let buildFullPath = require('axios/lib/core/buildFullPath');
		let fullurl = buildFullPath(config.baseURL, config.url);
		uni.request({
			method: config.method.toUpperCase(),
			url: buildURL(fullurl, config.params, config.paramsSerializer),
			header: config.headers,
			data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
			dataType: config.dataType,
			responseType: config.responseType,
			sslVerify: config.sslVerify,
			complete: function complete(response) {
				response = {
					data: response.data,
					status: response.statusCode,
					errMsg: response.errMsg,
					header: response.header,
					config: config
				};
				settle(resolve, reject, response);
			},
		});
	})
}
export default service

同时别忘了将配置的axios.js文件引入到main.js
配置main.js。由于笔者在uniapp中使用的Vue2.x版本,所以以下main.js内写法与Vue3.x的写法不同,请读者注意粘贴。

import Vue from 'vue'
import App from './App'
import uView from "uview-ui";
import axios from './common/axios/axios.js'

Vue.config.productionTip = false

Vue.use(uView);
Vue.prototype.$api = axios

App.mpType = 'app'
const app = new Vue({
	...App
})

app.$mount()

完成以上工作,uniapp引入axios组件的工作就完成了,那么下面就开始测试,是否可以正常访问了。

第三步、测试是否配置成功

1、由于由于跨域问题,于是笔者在后台的接口类上配置跨域注解。
CrossOrigin: 该注解用于标注该接口可被跨域访问。可能读者会想为什么不在前端配置代理来实现跨域呢?当前为了测试组件是否引入成功,所以一切从简,以测试结果为主。前端配置代理实现跨域请继续阅读下文。

@CrossOrigin
@RestController
public class MembersController {

    @Resource
    private MembersService membersService;


    /**
     * 登录账号
     * @param param 账号和密码
     * @return 返回 Ret
     */
    @PostMapping("/login")
    public Ret login(@RequestBody LoginBo param){
        return membersService.login(param);
    }
}

逻辑处理中心:

@Service
public class MembersService extends ServiceImpl<MembersMapper, Members> implements IService<Members> {


    @Resource
    private MembersMapper membersMapper;


    /**
     * 登录账号
     * @param param 账号和密码
     * @return 返回 Ret
     */
    public Ret login(LoginBo param) {
        // 1、验参
        String account = param.getAccount();
        // 2、查询结果并判断
        QueryWrapper<Members> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("account", account);
        Members members = membersMapper.selectOne(queryWrapper);
        if ( members == null ) {
            return Ret.builder().code(300).msg("登录失败!").build();
        } else if ( !Objects.equals(param.getPassword(), members.getPassword()) ) {
            return Ret.builder().code(300).msg("密码填写错误!").build();
        }
        // 3、封装返回登录成功日志信息
        LoginVo loginVo = LoginVo.builder()
                .account(account)
                .avatar(members.getAvatar())
                .token(account)
                .nickName(members.getNickName())
                .build();
        return Ret.builder().code(100).data(loginVo).build();
    }
}

uniapp中的login.vue页面
这个$api 是否眼熟,是的就是在main.js中配置的全局别名。

methods: {
	login() {
		let data = {
			...this.form
		}
		this.$api({
			method: 'post',
			url: '/login',
			data: data
		}).then(res => {
			if (res.code == 100) {
				// 存入本次缓存中
				uni.setStorageSync('userInfo', res.data);
				this.$u.toast('登录成功');
				uni.navigateBack();
			} else {
				this.$u.toast(res.msg);
			}
		}).catch(err => {
			console.log(err)
		});
	},
},

测试结果如下:
输入错误的账号和密码,请求状态 200,表示请求成功的意思,也就是表示axios组件引入成功了。
在这里插入图片描述

第四步、如何配置前端的代理来实现跨域呢?

这里需要用到manifest.json文件,点击该文件并选择源码视图
在这里插入图片描述

并在其中配置以下信息

"h5": {
	"devServer": {
		"hot": true,
		"port": 8080,
		"disableHostCheck": true,
		"proxy": {
			"/api": {
				"target": "http://127.0.0.1:7777/",
				"changeOrigin": true,
				"secure": false,
				"pathRewrite": {
					"^/api": ""
				}
			}
		}
	}
}

同时修改axios.js文件

const service = axios.create({
	baseURL: "/api",
	timeout: 6000
})

这时就可以删除后台接口上的 @CrossOrigin注解了。
下面测试结果如下:
在这里插入图片描述
测试成功,这样就实现了通过前端配置代理来解决跨域问题,同时这样服务器会更安全一些,避免被其他的前台所访问。以上是笔者在学习uniapp整合axios过程中的一些总结,希望可以对各位读者有所帮助。

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

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

相关文章

巨烽数字化采购项目启动,甄云助力医疗影像显示领军企业数智化升级

近日&#xff0c;医疗影像显示行业的领军者深圳市巨烽显示科技有限公司&#xff08;以下简称“巨烽”&#xff09;联合甄云科技举办数字化采购管理项目启动会&#xff0c;双方相关部门负责人及项目组成员参加了此次会议。 会上&#xff0c;就巨烽的数字化采购管理系统建设升级…

AI写作机器人-ai文章生成器在线

使用AI续写生成器&#xff0c;让内容创作事半功倍&#xff01; 随着人工智能技术的不断进步和应用&#xff0c;AI续写生成器的出现为内容创作带来了全新的革命。这种技术可以让你的写作事半功倍&#xff0c;让你轻松生成高质量的文章和内容。在这篇文章中&#xff0c;我们将介绍…

如何伪原创-自媒体伪原创软件

批量文字伪原创的作用 批量文字伪原创是指通过对原文进行修改、改写、调整等方式&#xff0c;生成大量新的类似原文的文本。其作用主要包括以下几个方面&#xff1a; 提高文本的独创性&#xff1a;批量伪原创可以有效地避免大量相似内容的出现&#xff0c;从而提高文本的独创性…

我如何学习使用 Jetpack Compose 开发 Android 应用程序

我如何学习使用 Jetpack Compose 开发 Android 应用程序 Jetpack Compose 和 Android 开发简介 2021 年 7 月&#xff0c;Google 发布了用于为 Android 应用构建原生 UI 的全新工具包 1.0 版。Jetpack Compose 是 Android 开发人员的游戏规则改变者&#xff0c;因为它从通过 X…

C#如何解决项目打开问题 error : 找不到指定的 SDK“Microsoft.NET.Sdk.WindowsDesktop”

错误提示&#xff0c;问题描述 后来发现&#xff0c;直接安装rider还是不能解决解决&#xff08;会自动配置关联&#xff08;path等&#xff09;&#xff0c;甚至自动下载的&#xff0c;官方的visual studio反而不会&#xff0c;之后再详细看怎么弄了&#xff09; VS2022项目…

IDEA 用上这款免费 GPT4 插件,生产力爆表了

大家好&#xff0c;我是一航&#xff01; 早前给大家分享过GPT的一些玩法&#xff0c;但是依旧有很多铁子没有掌握魔法的奥秘&#xff0c;始终没有用上&#xff1b;前两天&#xff0c;一兄台分享给我一款 IDE 插件&#xff1a;Bito-ChatGPT &#xff0c;安装就能直接在IDE中使…

如何选择合适的网络自动化工具

通过网络自动化工具实现网络自动化是所有网络组织的关键。如果没有合适的网络自动化工具&#xff0c;拥有由许多设备组成的大型网络环境的组织将无法执行重要操作&#xff0c;例如按时备份配置、实时跟踪不需要的更改以及遵守行业法规。当组织未能使用正确的网络自动化工具来执…

yolov8训练自己的数据集遇到的问题

训练分类模型 1.如何更改模型的类别数nc 根据本地模型配置文件.yaml可以设置nc 但是&#xff0c;这里无法用到预训练模型.pt模型文件&#xff0c;预训练模型的权重参数是在大数据集上训练得到的&#xff0c;泛化性能可能比较好&#xff0c;所以&#xff0c;下载了官方的分类…

Flink+Kafka、Pulsar实现端到端的exactly-once语义

End-to-End Exactly-Once Processing in Apache Flink with Apache Kafka 2017年12月Apache Flink社区发布了1.4版本。该版本正式引入了一个里程碑式的功能&#xff1a;两阶段提交Sink&#xff0c;即TwoPhaseCommitSinkFunction。该SinkFunction提取并封装了两阶段提交协议中的…

【离散数学】测试五 图论

1. n层正则m叉树一共有()片树叶。 A. nm B. mn C. mn 正确答案: B 2. 下图是一棵最优二叉树 A. 对 B. 错 正确答案: B 3. 要构造权为1,4,9,16,25,36,49,64,81,100一棵最优二叉树,则必须先构造权为5,9,16,25,36,49,64,81,100一棵最优二叉树. A. 对 B. 错 …

视频剪辑必备,这6个网站承包你一年的音效素材

视频剪辑中需要用到各种声音、音效素材&#xff0c;这些音效不仅能让你的视频更丰富&#xff0c;还能更好的表达视频内容&#xff0c;传递情绪让观者感到共鸣。很多朋友剪辑过程中为了找到好的配乐、音效&#xff0c;往往会花费大量的时间&#xff0c;找到了还有可能受版权限制…

装机必备(二补充)--Win10系统盘,装Win10系统(无法引导启动问题-找不到任务设备驱动程序。请确保安装介质包含正确的驱动程序)

对于联想的thinkpad&#xff0c;开机时候按F1来更改bios设置&#xff0c;F12是选择U盘引导启动 thinkpad如何进入bios界面_thinkpad怎么进入u盘启动&#xff0d;系统城 1 F1界面1.按→方向键移动到Security&#xff0c;将secure boot改成disabled&#xff0c;关闭安全启动&…

【数据结构】简单快速过一遍红黑树

文章目录 红黑树1 红黑树的概念2 红黑树的性质3 红黑树节点的定义4 红黑树的插入操作5 红黑树的验证6 红黑树与AVL树的比较7.C实现红黑树 红黑树 1 红黑树的概念 ​ 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;…

记一次oracle入库慢,log file switch (checkpoint incomplete)

AWR报告生成&#xff1a;Oracle AWR报告生成步骤_小百菜的博客-CSDN博客 发现log file switch (checkpoint incomplete) 这里出现了大量的log file switch(checkpoint incomplete)等待事件。 查看redo每个组的大小、状态 select group#,thread#,archived,status, bytes/102…

Python数据结构-----非递归实现快速排序

目录 前言&#xff1a; 非递归快排 1.概念原理 2.示例 Python代码实现 非递归快速排序 前言&#xff1a; 上一期我们学习了通过递归来实现快速排序的方法&#xff0c;那这一期我们就来一起学习怎么去通过非递归的方法来去实现快速排序的功能。&#xff08;上一期连接Pytho…

新来一00后,给我卷崩溃了..

2022年已经结束结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备今年的金三银四的面试计划。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的…

SLIC超像素分割算法

SLIC超像素分割算法 《SLIC Superpixels》 摘要 超像素在计算机视觉应用中越来越受欢迎。然而&#xff0c;很少有算法能够输出所需数量的规则、紧凑的超级像素&#xff0c;并且计算开销低。我们介绍了一种新的算法&#xff0c;将像素聚类在组合的五维颜色和图像平面空间中&a…

大四的告诫

&#x1f442; LOCK OUT - $atori Zoom/KALONO - 单曲 - 网易云音乐 &#x1f442; 喝了一口星光酒&#xff08;我只想爱爱爱爱你一万年&#xff09; - 木小雅 - 单曲 - 网易云音乐 其实不是很希望这篇文章火&#xff0c;不然就更卷了。。 从大一开始&#xff0c;每天10小时…

ccf b类及以上会议(准备)

SoCCACM Symposium on Cloud Computing http://dblp.uni-trier.de/db/conf/cloud/ SimLess: simulate serverless workflows and their twins and siblings in federated FaaS.Pisces: efficient federated learning via guided asynchronous training论文截止时间&#xff1a…

实现自定义dialog样式

1定义弹出的dialog样式 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:layout_width"match_parent"a…