前端学习七(前后端数据交互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>
View Code

二、自定义状态码错误范围

    <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>
View Code

三、实例化请求对象

    <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>
View Code

五、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>
View Code

六、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>
View Code

 

posted @ 2021-11-14 22:53  whitewall  阅读(365)  评论(0)    收藏  举报