前端学习七(前后端数据交互axios)
axios官网:http://www.axios-js.com/zh-cn/docs/index.html#axios-request-config-1
axios和ajax的区别:
1、理论区别;
axios是通过Promise实现对ajax技术的一种封装,就像jquery对ajax的封装一样;
ajax技术实现了局部数据的刷新,axios实现了对ajax的封装,axios有的ajax都有,ajax有的axios不一定有。
2、逻辑区别
ajax:ajax本身是针对MVC的编程;
axios:axios符合现在前端MVVM的浪潮。
promise介绍:
Promise是ES6新增的一种语法,是异步编程的一种解决方案。(旧方案是单纯的使用回调函数)
(1)从语法上说,promise是一种构造函数;
(2)从功能上说,promise 对象用来封装一个异步操作并可以获取其成功/失败的结果值。
Promise的三种状态:
pending(进行中,初始状态)
ulfilled(成功状态,也叫resolved)
rejected(失败状态)
async和await在axios中的作用:
async和await是ES2017中引入的关键字,用于异步编程。
async用于定义一个异步函数,await用于等待异步函数执行完成并返回结果。
在axios中,async和await通常用于处理异步请求,可以让代码更加简洁易读。
当我们使用async关键字定义一个异步函数时,函数内部的代码会自动转换成Promise对象,
而使用await关键字可以等待Promise对象的状态变为resolved后,再执行后续的代码。
一、axios请求和简写
一定要引入请求库aioxs

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <!-- 引入前端的请求库axios --> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> </head> <body> <script> // axios发送的是异步请求,返回的Promise是异步对象 const rsp = axios.get("http://127.0.0.1:5000/api/projects") // 可以通过回调函数获取response对象 rsp.then((result) => { console.log(result); }) // 简写 axios.get("http://127.0.0.1:5000/api/projects1").then((rsp) => { console.log(rsp); console.log(rsp.status); console.log(rsp.data); }).catch((error)=>{ // 响应码是3、4、5会走这个步骤 console.log(error); }) </script> </body> </html>
二、自定义状态码错误范围

<script> axios.get("http://127.0.0.1:5000/api/projects1", { validateStatus: function (status) { return status<500 } } ).then((rsp) => { console.log(rsp); console.log(rsp.status); console.log(rsp.data); }) // .catch((error) => { // // 响应码是3、4、5会走这个步骤 // console.log(error); // }) </script>
三、实例化请求对象
<script> // 创建请求对象 const instance = axios.create({ baseURL: 'http://127.0.0.1:5000', timeout: 1000, // 添加请求头 headers: { 'X-Custom-Header': 'foobar' }, // 指定http状态码错误范围 validateStatus: function (status) { return status < 500 } }); // 进行请求 instance.get("/api/projects").then((rsp) => { console.log(rsp); console.log(rsp.status); console.log(rsp.data); }) </script>
四、get请求参数传递方式

<script> // 创建请求对象 const instance = axios.create({ baseURL: 'http://127.0.0.1:5000', timeout: 1000, // 添加请求头 headers: { 'X-Custom-Header': 'foobar' }, // 指定http状态码错误范围 validateStatus: function (status) { return true } }); // 参数传递方式1 instance.get("/api/interface?id=1001").then((rsp) => { console.log(rsp.data); }) // 参数传递方式2 instance.get("/api/interface", { params: { id: 1002 } }).then((rsp) => { console.log(rsp.data); }) </script>
五、post请求参数传递方式(表单、json)

<script> // 创建请求对象 const instance = axios.create({ baseURL: 'http://127.0.0.1:5000', timeout: 1000, // 添加请求头 headers: { 'X-Custom-Header': 'foobar' }, // 指定http状态码错误范围 validateStatus: function (status) { return true } }); // 参数传递,json instance.post("/api/user/login", { user: "python01", pwd: "lemonban" }).then((rsp) => { console.log('json传递的返回',rsp); }).catch((err) => { console.log(err); }); // 参数传递,表单 // 先创建表单对象 const params = new URLSearchParams() params.append("user", "python01") params.append("pwd", "lemonban") instance.post("/api/user/login", params).then((rsp) => { console.log('表单传递的返回',rsp); }).catch((err) => { console.log(err); }); </script>
六、axios结合async、await的使用
<script> // 创建请求对象 const instance = axios.create({ baseURL: 'http://127.0.0.1:5000', timeout: 1000, // 添加请求头 headers: { 'X-Custom-Header': 'foobar' }, // 指定http状态码错误范围 validateStatus: function (status) { return true } }); // 添加请求拦截器 instance.interceptors.request.use(function (config) { // 在发送请求之前做些什么 // 获取sessioStorage中的token,并添加到请求头或者请求体中 const token = window.sessionStorage.getItem("token") if (token) { config.headers.Mytoken = token } return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); }); // async和await结合axios使用 async function login() { // 不加await会返回一个异步的对象;await只能在异步函数中使用 const rsp = await instance.post("/api/user/login", { user: "python01", pwd: "lemonban" }) console.log(rsp); if (rsp.data.code == '1') { const token = rsp.data.token; console.log("获取token成功", token); // 将token存储到sessioStorage(会话级别存储) window.sessionStorage.setItem("token", token) } else { console.log("登录失败"); } } async function demo() { const rsp = await instance.get("/api/interface?id=1001") console.log("get请求", rsp); } login() demo() // 添加响应拦截器 instance.interceptors.response.use(function (response) { // 对响应数据做点什么 // 直接获取响应的data数据 return response.data; }, function (error) { // 对响应错误做点什么 return Promise.reject(error); }); // 验证是否真的拿的是data数据 demo() </script>
七、练习

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> <script src="https://unpkg.com/element-ui/lib/index.js"></script> <style type="text/css"> body { background: url(lol.jpeg); } .box-card { width: 400px; margin: auto; margin-top: 200px; text-align: center; background-color: rgba(0, 0, 0, 20%); border: 0rem; } .el-input { padding: 8px; } </style> </head> <body> <div id="app"> <el-card class="box-card"> <h4>欢迎来到英雄联盟</h4> <el-input v-model="loginData.usr" placeholder="请输入账号"></el-input> <el-input v-model="loginData.pwd" placeholder="请输入密码" type="password"></el-input> <el-button type="primary" style="margin-top: 10px;" @click="login()">登录</el-button> </el-card> </div> <script type="text/javascript"> const instance = axios.create({ baseURL: 'http://127.0.0.1:5000', timeout: 1000, }); var vue = new Vue({ el: "#app", data: { loginData: { usr: "", pwd: "" } }, methods: { async login() { try { const rsp = await instance.post("/api/user/login", { user: this.loginData.usr, pwd: this.loginData.pwd }) } catch (e) { alert("网络异常") } console.log(rsp); if (rsp.data.code == '1') { const token = rsp.data.token; console.log("获取token成功", token); window.sessionStorage.setItem("token", token) } else { alert("登录失败") } } } }) </script> </body> </html>