浅析axios原理与使用(包括axios的优雅写法与res的解构赋值)

前言

目前的前端项目中,用的最多的便是axios交互。所以本节将针对axios的原理对axios的使用进行剖析讲解,要求读者读文章时需要有ajax的基础(了解知原理)。文章后面会对返回值res的解构进行讲解。

一,什么是axios

官方定义:Axios是一个基于promise 的 HTTP 库,可以用在浏览器和 node.js中。
原理:axios本质上也是对原生XHR的封装,只不过它是Promise的实现版本,符合最新的ES规范。(Promise在后续博客中会有更新,欢迎关注)。

二,axios的基本使用

首先需要引入axios文件

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

2.1 不含参的axios调用

不含参的调用遵循以下格式:

axios(methods,url,fn)

实例如下:

        const result = axios({
            method: 'GET',
            url: 'http://www.liulongbin.top:3006/api/getbooks'
        }).then(function(books) {
            console.log(books);
        })
        console.log(result);

其中,result是一个promise对象:
在这里插入图片描述
从这点可以看出,在调用axios后得到的是promise对象(在后续博客中会更新promise的详细讲解,欢迎关注!)
接着,我们来看看回调函数中打印出来的返回值是什么:
在这里插入图片描述
object是一个对象,对象中最重要的属性是data属性:
在这里插入图片描述
而data中又有一个data,这个data中的data是获取到的内容:
在这里插入图片描述所以我们在渲染内容时其实用到的是books.data.data;获取到的状态码是books.data.status,其余同理。

2.2 含参数的axios调用

axios的调用无非两种,一种是发起get请求,一种是发起post请求,而发起这两种请求时我们都需要根据接口文档来分析是否需要传递参数。如果要传递参数,两种请求的传参格式是不一样的。

我们先来看看传参的axios具体使用格式是什么:

axios(methods, url, 参数:{}, fn)

其中,==发起get请求,参数传递格式是params:{参数};而发起post请求,参数传递的格式是data: {参数}。

具体实例如下:
先看发起get请求:

        axios({
            // 请求方式
            method: 'GET',
            // 请求地址
            url: 'http://www.liulongbin.top:3006/api/getbooks',
            // url中的查询参数
            params: {
                id: 1
            }
        }).then(function(res) {
            console.log(res);
        })

发起post请求:

        axios({
            method: 'POST',
            url: 'http://www.liulongbin.top:3006/api/post',
            data: {
                name: 'zs',
                age: 20
            }
        }).then(function(res) {
            console.log(res);
        })

三,axios的原理(拦截器)

这里抛出个问题,在第一个点中我们讲过,在调用axios请求后获得的对象中有一个data属性,而data中还有一个data,我们获取到的数据就在这个最里面的data中,这是为什么呢?

3.1 客户端与服务器之间的交互原理(复习可略过)

这里对客户端与服务器之间的交互进行温习:
客户端给服务器发起一个请求,ajax,axios等都是用来做这个事情的。在发起请求时,会根据接口文档,客户端向服务器提供url地址,请求方法,以及参数;

发给服务器后,服务器接收到客户端的请求后,会响应服务器,并把响应信息传给客户端。客户端收到信息后可以渲染到界面上。

3.2 浅析axios原理

根据上面的讲解,我们意识到了axios获得的数据不是真实的数据,真实的数据是最里面data的内容,这是因为axios相当于是在请求数据后,在数据外面套了一层壳后返回给了客户端,所以客户端获取数据时需要层层剖析,具体如下图所示:
在这里插入图片描述

四,axios的优雅写法(了解)

4.1 浅析async和await

(这里只是讲解用法与浅层面上的原理,但教会您使用绰绰有余,后续还会更新原理的详细讲解,js的同步与异步等知识点,欢迎关注!)

首先,async和await是配合使用的。大家可以把async理解为一种函数类型。
请看以下代码:

async function fn(){
  return 100
}
console.log(fn())  //返回一个成功态的promise对象,result 是 100
fn().then(
  data=>{
    console.log(data)
  }
) // 100

而await需要配合async的使用,await后面要求接Promise,上文讲过,axios传回来的是一个Promise,所以我们的await后面也可以接axios,相当于是一个回调函数。await p相当于是p.then,而且是指成功状态的回调函数。
await与then的区别是,then的回调函数中需要传参,而await不需要

这里我们重点使用async与await的配合使用,请按以下格式使用:

(async function(){
  const res = await fn() //fn()会返回promise对象,原理一样
  console.log(res) //400
})()

大家请看如下代码,配合使用与传统axios请求的区别对照代码
传统使用:

        const result = axios({
            method: 'GET',
            url: 'http://www.liulongbin.top:3006/api/getbooks'
        }).then(function(books) {
            console.log(books);
        })
        console.log(result);

配套使用:

        toget.addEventListener('click', async function() {
            const result = await axios({
                method: 'get',
                url: 'http://www.liulongbin.top:3006/api/getbooks',
                param: {
                    id: 1
                }
            })
            console.log(result);
        })

区别就在于,一个使用了回调函数(异步),另一个没有then做回调(同步写异步),最后结果都是一样的,但是更优雅。

五,res的结构赋值

以get请求为例:
如果我们发起get请求,返回值result是一个data对象,而data对象内部的data才是真正的数据:
在这里插入图片描述
真正数据的表示方法其实是data.data,略微麻烦,略微奇怪。如何避免这种写法——解构赋值,请看以下代码:

    <button class="toget">发起get请求</button>
    <button class="topost">发起post请求</button>
    <script>
        document.querySelector('.toget').addEventListener('click', async function() {
            const { data:res } = await axios.get('http://www.liulongbin.top:3006/api/getbooks',{
                param: {
                    id: 1
                }
            })
            console.log(res);
        })

        // 发起post请求
        document.querySelector('.topost').addEventListener('click', async function() {
            const { data:res } = await axios.post('http://www.liulongbin.top:3006/api/post',{
                data: {
                    name: 'zs',
                    age: 20
                }
            })
            console.log(res);
        })

我们令得到的data为res,则data.data就变成了res,而data.data就变成了res.data。
打印出来的res与之前的外层data是一样的,这样表示更加清晰。
在这里插入图片描述

六,总结

通过本节的学习我们了解到了axios的原理与使用方法,axios的优雅写法与res的结构赋值以及其中的道理。

希望这篇博客能够真正帮助到你!后期会考虑更新更多js原理的理解与使用,谢谢喜欢,欢迎关注!

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3Axios 是针对 Vue3.x 版本封装的 Axios 库,可以更方便地在 Vue3.x 项目中使用 Axios 进行网络请求。下面我将介绍如何使用 Vue3Axios 进行封装和使用。 ## 安装 首先需要安装 Vue3AxiosAxios 库: ```bash npm install vue3-axios axios --save ``` ## 封装 在 src 目录下新建一个 api 目录,用于存放我们的接口请求。在该目录下新建一个 index.js 文件,用于封装 Axios。 ```javascript import axios from "axios"; // 创建 Axios 实例 const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url timeout: 5000 // 请求超时时间 }); // 请求拦截器 service.interceptors.request.use( config => { // 在发送请求之前做些什么 return config; }, error => { // 处理请求错误 console.log(error); // for debug return Promise.reject(error); } ); // 响应拦截器 service.interceptors.response.use( response => { const res = response.data; // 如果返回的状态码不是 200,说明接口有问题 if (res.code !== 200) { console.log(res.message); // 弹出错误信息 return Promise.reject(new Error(res.message || "Error")); } else { return res; } }, error => { // 处理响应错误 console.log(error); // for debug return Promise.reject(error); } ); export default service; ``` 这里使用Axios 的拦截器,用于处理请求和响应的错误,如果返回的状态码不是 200,则弹出错误信息,否则返回响应的数据。 ## 使用 在需要使用接口请求的组件中引入封装好的 Axios: ```javascript import request from "@/api/index.js"; export default { data() { return { list: [] }; }, mounted() { this.getList(); }, methods: { getList() { request({ url: "/list", method: "get", params: { page: 1, limit: 10 } }).then(response => { this.list = response.data; }); } } }; ``` 这里使用了封装好的 Axios 进行了一个 GET 请求,并将返回的数据绑定到了组件的 list 数据中。 至此,Vue3Axios 的封装和使用就介绍完了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值