025_Axios

本文详细介绍了axios在浏览器和node.js环境下的使用,包括Promise支持、参数传递、响应结果分析、全局配置和拦截器的设置,以及async/await的实践应用,还提供了前后端交互的示例和axios在Web工程中的实现

1. axios是一个基于Promise用于浏览器和node.js的http客户端。

2. axios具有以下特征

2.1. 支持浏览器和node.js。

2.2. 支持Promise。

2.3. 能拦截请求和响应。

2.4. 自动转换JSON数据。

3. axios get请求传递参数

3.1. 通过url传递参数

axios.get('aa.action?id=123').then(function(ret){
		      
});

3.2. 通过params选项传递参数

axios.get('aa.action', {
	params: {
		id: 456
	}
}).then(function(ret){
  	
});

4. axios post请求传递参数

4.1. 通过选项传递参数, 默认传递的是json格式的数据

axios.post('aapj.action', {
	uname: 'lisi',
	pwd: 456
}).then(function(ret){
  	
});

4.2. 通过URLSearchParams传递参数, 发送的是传统的表单类型的数据

var params = new URLSearchParams();
params.append('uname', 'zhangsan');
params.append('pwd', '123');
axios.post('aap.action', params).then(function(ret){
  	
});

5. axios响应结果的主要属性

5.1. data: 实际响应回来的数据。

5.2. headers: 响应头信息。

5.3. status: 响应状态码。

5.4. statusText: 响应状态信息。

6. axios全局配置信息

6.1. 配置请求的基准URL地址: axios.defaults.baseURL = 'http://localhost:8080/Axios'。

6.2. 全局设置超时时间: axios.defaults.timeout = 3000。

6.3. 全局设置请求头信息: axios.defaults.headers['mytoken'] = 'aQWd15SFSa67sSD654FS48AT'。

7. axios请求拦截器

7.1. 在请求发出之前设置一些信息

axios.interceptors.request.use(function(config) {
	return config;
}, function(err){
      
});

 8. axios响应拦截器

8.1. 在获取数据之前对数据做一些加工

axios.interceptors.response.use(function(res) {
	    		
}, function(err){
      
});

 8. async/await的基本用法

8.1. async/await是ES7引入的新语法, 可以更加方便的进行异步操作。

8.2. async关键字用于函数上(async函数的返回值是Promise实例对象)。

8.3. await关键字用于async函数当中(await可以得到异步的结果)。

8.4. async/await用法

async function queryData() {
	var ret = await axios.get('aa.action?id=123');
};
queryData();

8.5. async/await发送多个异步请求

async function queryData() {
	var ret = await axios.get('aa.action?id=123');

	ret = await axios.post('aapj.action', {
		uname: 'lisi',
		pwd: 456
	});
};
queryData();

9. 新建一个名为Axios的动态Web工程

9.1. 编写AxiosAjax.java

package com.bjbs.aa;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AxiosAjax extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String id = req.getParameter("id");
		resp.getWriter().write("Axios Ajax get Request...   id = " + id);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

9.2. 编写AxiosAjaxPost.java

package com.bjbs.aa;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AxiosAjaxPost extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String uname = req.getParameter("uname");
		String pwd = req.getParameter("pwd");
		resp.getWriter().write("Axios Ajax post Request...   uname = " + uname + ", pwd = " + pwd);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

9.3. 编写AxiosAjaxPostJson.java

package com.bjbs.aa;

import java.io.BufferedReader;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AxiosAjaxPostJson extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		BufferedReader br = req.getReader();
		String result = "", rl = null;
		while((rl = br.readLine()) != null) {
			result += rl;
		}
		System.out.println("Axios Ajax post Request Json Param...   result = " + result);
		
		String res = "{\"code\":1,\"result\":\"success.\"}";
		resp.getWriter().write(res);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

9.4. 编写axios.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>axios基本用法</title>
	</head>
	<body>
		<script type="text/javascript" src="axios.js"></script>
		<script type="text/javascript">
			// 配置请求的基准URL地址
	    	axios.defaults.baseURL = 'http://localhost:8080/Axios';
	    	// 全局设置超时时间
			axios.defaults.timeout = 3000;
	    	// 全局设置请求头信息
	        axios.defaults.headers['mytoken'] = 'aQWd15SFSa67sSD654FS48AT';
		
			axios.get('aa.action?id=123').then(function(ret){
		    	// 注意data属性是固定的用法, 用于获取后台的实际数据
		      	document.write(ret.data + "<br />");
		    });
			
			axios.get('aa.action', {
				params: {
					id: 456
				}
			}).then(function(ret){
		      	document.write(ret.data + "<br />");
		    });
			
			// 传递传统的表单类型的数据
			var params = new URLSearchParams();
			params.append('uname', 'zhangsan');
			params.append('pwd', '123');
			axios.post('aap.action', params).then(function(ret){
		      	document.write(ret.data + "<br />");
		    });
			
			// 默认传递JSON格式数据
			axios.post('aapj.action', {
				uname: 'lisi',
				pwd: 456
			}).then(function(ret){
		      	document.write("code = " + ret.data.code + ", result = " + ret.data.result + "<br />");
		    });
		</script>
	</body>
</html>

9.5. 编写async-await.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>异步请求</title>
	</head>
	<body>
		<script type="text/javascript" src="axios.js"></script>
		<script type="text/javascript">
	        async function queryData() {
	        	var ret = await axios.get('aa.action?id=123');
	        	document.write(ret.data + "<br />");
	        	
	        	ret = await axios.post('aapj.action', {
					uname: 'lisi',
					pwd: 456
				});
	        	document.write("code = " + ret.data.code + ", result = " + ret.data.result + "<br />");
	        };
	        queryData();
		</script>
	</body>
</html>

9.6. 编写interceptors.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>axios拦截器</title>
	</head>
	<body>
		<script type="text/javascript" src="axios.js"></script>
		<script type="text/javascript">
			// 全局设置超时时间
			axios.defaults.timeout = 3000;
		
			// 请求拦截器
	    	axios.interceptors.request.use(function(config) {
	    		console.log(config);
	    		config.headers.mytoken = 'aQWd15SFSa67sSD654FS48AT';
	    		return config;
	    	}, function(err){
	    	      console.log(err);
	        });
			
	    	// 响应拦截器
	    	axios.interceptors.response.use(function(res) {
	    		console.log(res);
	    		return res;
	    	}, function(err){
	    	      console.log(err);
	        });
		
			axios.get('aa.action?id=123').then(function(ret){
		      	document.write(ret.data + "<br />");
		    });
			
			var params = new URLSearchParams();
			params.append('uname', 'zhangsan');
			params.append('pwd', '123');
			axios.post('aap.action', params).then(function(ret){
		      	document.write(ret.data + "<br />");
		    });
		</script>
	</body>
</html>

9.7. 修改web.xml

9.8. 运行项目, 访问axios.html 

9.9. 运行项目, 访问interceptors.html 

<template> <div class="navbar"> <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> <breadcrumb v-if="!topNav" id="breadcrumb-container" class="breadcrumb-container" /> <top-nav v-if="topNav" id="topmenu-container" class="topmenu-container" /> <div class="right-menu"> <template v-if="device!==&#39;mobile&#39;"> <search id="header-search" class="right-menu-item" /> <!-- <el-tooltip content="源码地址" effect="dark" placement="bottom"> <ruo-yi-git id="qiya-git" class="right-menu-item hover-effect" /> </el-tooltip> --> <!-- <el-tooltip content="文档地址" effect="dark" placement="bottom"> <ruo-yi-doc id="qiya-doc" class="right-menu-item hover-effect" /> </el-tooltip> --> <screenfull id="screenfull" class="right-menu-item hover-effect" /> <el-tooltip content="布局大小" effect="dark" placement="bottom"> <size-select id="size-select" class="right-menu-item hover-effect" /> </el-tooltip> </template> <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover"> <div class="avatar-wrapper"> <img :src="avatar" class="user-avatar"> <span class="user-nickname"> {{ nickName }} </span> </div> <el-dropdown-menu slot="dropdown"> <router-link to="/user/profile"> <el-dropdown-item>个人中心</el-dropdown-item> </router-link> <el-dropdown-item divided @click.native="logout"> <span>退出登录</span> </el-dropdown-item> </el-dropdown-menu> </el-dropdown> <div class="right-menu-item hover-effect setting" @click="setLayout" v-if="setting"> <svg-icon icon-class="more-up" /> </div> </div> </div> </template> <script> import { mapGetters } from &#39;vuex&#39; import Breadcrumb from &#39;@/components/Breadcrumb&#39; import TopNav from &#39;@/components/TopNav&#39; import Hamburger from &#39;@/components/Hamburger&#39; import Screenfull from &#39;@/components/Screenfull&#39; import SizeSelect from &#39;@/components/SizeSelect&#39; import Search from &#39;@/components/HeaderSearch&#39; import QiYaGit from &#39;@/components/QiYa/Git&#39; import QiYaDoc from &#39;@/components/QiYa/Doc&#39; export default { emits: [&#39;setLayout&#39;], components: { Breadcrumb, TopNav, Hamburger, Screenfull, SizeSelect, Search, QiYaGit, QiYaDoc }, computed: { ...mapGetters([ &#39;sidebar&#39;, &#39;avatar&#39;, &#39;device&#39;, &#39;nickName&#39; ]), setting: { get() { return this.$store.state.settings.showSettings } }, topNav: { get() { return this.$store.state.settings.topNav } } }, methods: { toggleSideBar() { this.$store.dispatch(&#39;app/toggleSideBar&#39;) }, setLayout(event) { this.$emit(&#39;setLayout&#39;) }, logout() { this.$confirm(&#39;确定注销并退出系统吗?&#39;, &#39;提示&#39;, { confirmButtonText: &#39;确定&#39;, cancelButtonText: &#39;取消&#39;, type: &#39;warning&#39; }).then(async () => { try { // 1. 显示加载状态 const loadingInstance = this.$loading({ fullscreen: true }); // 2. 取消所有进行中的请求 if (this.$http.cancelAllRequests) { this.$http.cancelAllRequests(&#39;Operation canceled by logout&#39;); } // 3. 执行退出操作 await this.$store.dispatch(&#39;LogOut&#39;); // 4. 完全重置前端状态 this.resetApplicationState(); // 5. 导航到登录页(不刷新) await this.$router.push({ path: &#39;/login&#39;, query: { logout: &#39;success&#39;, t: Date.now() // 防止缓存 } }); // 6. 显示退出成功消息 this.$message.success(&#39;您已安全退出系统&#39;); } catch (error) { console.error(&#39;退出失败:&#39;, error); } finally { this.$nextTick(() => { loadingInstance.close(); }); } }).catch(() => {}); }, resetApplicationState() { // 清除所有存储 localStorage.clear(); sessionStorage.clear(); // 重置Vuex状态 this.$store.commit(&#39;RESET_ALL_STATE&#39;); // 清除axios默认头 delete axios.defaults.headers.common[&#39;Authorization&#39;]; // 重置路由 this.$router.app.$options.router.matcher = new Router().matcher; } } } </script> <style lang="scss" scoped> .navbar { height: 50px; overflow: hidden; position: relative; background: #fff; box-shadow: 0 1px 4px rgba(0,21,41,.08); .hamburger-container { line-height: 46px; height: 100%; float: left; cursor: pointer; transition: background .3s; -webkit-tap-highlight-color:transparent; &:hover { background: rgba(0, 0, 0, .025) } } .breadcrumb-container { float: left; } .topmenu-container { position: absolute; left: 50px; } .errLog-container { display: inline-block; vertical-align: top; } .right-menu { float: right; height: 100%; line-height: 50px; &:focus { outline: none; } .right-menu-item { display: inline-block; padding: 0 8px; height: 100%; font-size: 18px; color: #5a5e66; vertical-align: text-bottom; &.hover-effect { cursor: pointer; transition: background .3s; &:hover { background: rgba(0, 0, 0, .025) } } } .avatar-container { margin-right: 0px; padding-right: 0px; .avatar-wrapper { margin-top: 10px; position: relative; .user-avatar { cursor: pointer; width: 30px; height: 30px; border-radius: 50%; } .user-nickname{ position: relative; bottom: 10px; font-size: 14px; font-weight: bold; } .el-icon-caret-bottom { cursor: pointer; position: absolute; right: -20px; top: 25px; font-size: 12px; } } } } } </style> 点击退出登录报错:退出失败: TypeError: Cannot read properties of undefined (reading &#39;cancelAllRequests&#39;) at eval (Navbar.vue:109:1) at Generator.eval (regenerator.js:52:1) at Generator.eval [as next] (regeneratorDefine.js:11:1) at asyncGeneratorStep (asyncToGenerator.js:3:1) at _next (asyncToGenerator.js:17:1) at eval (asyncToGenerator.js:22:1) at new Promise (<anonymous>) at eval (asyncToGenerator.js:14:1) overrideMethod @ hook.js:608 eval @ Navbar.vue:132 eval @ regenerator.js:52 eval @ regeneratorDefine.js:11 asyncGeneratorStep @ asyncToGenerator.js:3 _next @ asyncToGenerator.js:17 eval @ asyncToGenerator.js:22 eval @ asyncToGenerator.js:14 Promise.then logout @ Navbar.vue:103 click @ Navbar.vue:91 invokeWithErrorHandling @ vue.runtime.esm.js:1854 invoker @ vue.runtime.esm.js:2179 original._wrapper @ vue.runtime.esm.js:6917 Navbar.vue:106 [Vue warn]: Error in nextTick: "ReferenceError: loadingInstance is not defined" found in ---> <Navbar> at src/layout/components/Navbar.vue <Layout> at src/layout/index.vue <App> at src/App.vue <Root> overrideMethod @ hook.js:608 warn @ vue.runtime.esm.js:619 logError @ vue.runtime.esm.js:1884 globalHandleError @ vue.runtime.esm.js:1879 handleError @ vue.runtime.esm.js:1839 eval @ vue.runtime.esm.js:1982 flushCallbacks @ vue.runtime.esm.js:1906 Promise.then timerFunc @ vue.runtime.esm.js:1933 nextTick @ vue.runtime.esm.js:1990 Loading @ element-ui.common.js:28724 eval @ Navbar.vue:106 eval @ regenerator.js:52 eval @ regeneratorDefine.js:11 asyncGeneratorStep @ asyncToGenerator.js:3 _next @ asyncToGenerator.js:17 eval @ asyncToGenerator.js:22 eval @ asyncToGenerator.js:14 Promise.then logout @ Navbar.vue:103 click @ Navbar.vue:91 invokeWithErrorHandling @ vue.runtime.esm.js:1854 invoker @ vue.runtime.esm.js:2179 original._wrapper @ vue.runtime.esm.js:6917 Navbar.vue:106 ReferenceError: loadingInstance is not defined at VueComponent.eval (Navbar.vue:135:1) at Array.eval (vue.runtime.esm.js:1980:1) at flushCallbacks (vue.runtime.esm.js:1906:1)
最新发布
08-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值