Axios是什么?

 Axios是一个基于promise的HTTP库,能够用在浏览器和node.js中

Axios的特点

  • 从浏览器中创立XMLHttpRequests
  • 从node.js创立https申请
  • 反对Promise API
  • 拦挡申请数据和响应数据
  • 勾销申请
  • 主动转换JSON数据
  • 客户端反对进攻XSRF

如何引入?

应用npm引入

$ npm install axios

应用bower引入

$ bower install axios

应用cdn引入

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

应用xhr封装ajax申请参数

//4.响应的json数据主动解析为js的对象/数组        function axios({            url,            method='GET',            params={},            data={}        }) {            //返回一个Promise对象            return new Promise((resolve,reject) => {                //解决method(转大写)                method = method.toUpperCase()                //解决query参数(拼接到url上)  id=1&xxx=abc                /*                     {                        id: 1,                        xxx: 'abc'                    }                */                let queryString = ''                Object.keys(params).forEach(key => {                    queryString += `${key}=${params[key]}&`                })                  if (queryString) {                    // 去除最初的&                    queryString =  queryString.substring(0,queryString.length-1)                    // 接到url                    url += '?' + queryString                }                   //1.执行异步ajax申请                //创立xhr对象                const request = new XMLHttpRequest()                //关上连贯(初始化申请,没有申请)                request.open(method, url, true)                //发送申请                if (method === 'GET' || method === 'DELETE') {                    request.send()    //异步的                }else if(method==='POST' || method === 'PUT'){                    request.setRequestHeader('Content-Type','application/json;charset=utf-8')//通知服务器申请体的格局是                    request.send(JSON.stringify(data)) //发送json格局的申请参数                }                //绑定状态的监听                request.onreadystatechange = function () {                    //发送申请是异步的,绑定状态的监听为同步因而该函数放哪后面和前面都能够                    if (request.readyState !== 4) {                        return                     }                    // 如果响应状态码在[200,300]之间代表胜利,否则失败                       //es6解构赋值                    const {status, statusText} = request                    //如果申请胜利了,调用resolve()                      if (status>=200 && status<=299) {                        // 筹备后果数据对象response                        const response = {                            data:JSON.parse(request.response), //响应体解析好的数据                            status, //响应体的状态码                            statusText  //响应体对应的文本                         }                        resolve(response)                    }else{                           //如果申请失败了,调用reject()                        reject(new Error('request error status is ' + status))                    }                                    }                           })        }

指定默认配置

 在文档中具备三个罕用的全局axios默认值:

axios.defaults.baseURL = 'https://api.example.com';axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; //传入tokenaxios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';在发送前编码所有字符,此设置是默认设置。

 咱们罕用的设置是axios.defaults.baseURL,用于定义url地址,使得咱们在参数传递时,只传递参数对应参数即可。例:

// 指定默认配置        axios.defaults.baseURL = 'http://localhost:3000'        /* 1.GET申请:从服务器端获取数据 */        function testGet(){            axios({                    url:'/posts',                    params:{                        id:1                     }                }).then(response => {                    console.log('/posts get',response.data)                })        }           /* 2.POST申请:向服务端去存储数据 */        function testPost() {               axios({                url:'/posts',                method:'post',                data:{title: "json-server4", author: "typicode4"}            }).then(response => {                    console.log('/posts post',response.data)                })            }        /* 3.PUT申请:更新服务器曾经数据 */        function testPut() {            axios({                url:'/posts/4',                method:'put',                data:{title: "json-server5", author: "typicode5"}            }).then(response => {                    console.log('/posts put',response.data)                })                        }        /* 4.DELETE申请:删除服务器端的数据 */        function testDelete() {            axios({                url:'/posts/4',                method:'delete',            })                .then(response => {                    console.log('/posts delete',response.data)                })        }

自定义实例默认值

 咱们为什么要设计自定义实例?

  • 应接需要:我的项目中由局部接口须要的配置由另一部分须要的配置不一样
  • 解决办法:创立2个新的axios实例,每个都有本人特有的配置,能够利用于不同要求的申请接口中。
        const instance = axios.create({            baseURL : 'http://localhost:4000'         })        //应用instance发申请        instance({            url:'/xxx'   //申请4000        })        instance.get('/xxx')            //创立第二个实例,用于更改不同的配置        const instance2 = axios.create({            baseURL:'htto://localhost:8081'        })        instance2({            url:'/yyy'        })        instance2.get('/yyy')

申请拦截器

        //增加申请拦截器(回调函数)        axios.interceptors.request.use(            config => {            //在发送申请申请之前会执行下列如下                console.log('request interceptor1 onResolved()')                return config            },            error =>{            //在发送申请失败会执行下列如下                console.log('request interceptor1 onRejected()')                return Promise.reject(error)            }        )      //增加响应函数        axios.interceptors.response.use(            response => {            //在响应数据胜利后会执行如下                console.log('response interceptor1 onResolved')                return response            },            function(error){            //在响应数据失败后会执行如下                console.log('response interceptor1 onRejected')                return Promise.reject(error)            }        )       // 发送申请       axios.get('http://localhost:3000/posts')           .then(response => {               console.log('data',response.data)           })           .catch(error => {               console.log('error',error.message)           })

撤销申请

 当咱们点击按钮进行发送申请的时候,如果此时申请正在发送中,而用户却不通晓,用户可能会反复点击按钮进行发送申请,此时咱们应用撤销申请,如果以后申请还正在响应,用户再次点击按钮则会勾销上次正在发送的申请,避免服务器接管多个申请,并屡次做出响应。
实例:

//定义拦截器模块         //增加申请拦截器        axios.interceptors.request.use((config) => {            //在筹备发申请前,勾销未实现的申请,使得反复点击时,勾销上次发送的申请            if (typeof cancel === 'function') {                cancel('勾销申请')            }            //给config增加一个cancelToken的配置            config.cancelToken = new CancelToken(function executor(c) { //c 是用于勾销以后申请的函数                // 保留勾销函数,用于之后可能须要勾销以后的申请                cancel = c;            })            return config        })                //增加响应拦截器        axios.interceptors.response.use(            //当响应胜利后,勾销在发送申请时增加的撤销函数            response => {                cancel = null                return response            },             error => {                if (axios.isCancel(error)) {                    console.log('申请勾销的谬误',error.message)                    //中断Promise链    下面要中断请求                    return new Promise(() => {})                }else{  //申请出错了                    cancel = null                    // console.log('申请1失败了',error.message)                    //将谬误向下传递                    // throw error   上面要将谬误向下传递                    return Promise.reject(error)                }            }        )        //引入CancelToken 构造函数        const CancelToken = axios.CancelToken;        let cancel  //用于保留申请的函数        function getProduct1() {            axios({                 url:'http://localhost:4000/products1',            }).then(                response => {                    console.log('申请1胜利了',response.data)                },                error => {//只用于解决申请失败的状况,勾销申请的谬误不必                   console.log('申请1失败了',error.message)                }               )        }

强制撤销申请

         /* 撤销申请 */        function cancelReq() {            // alert('勾销申请')            //执行勾销申请的函数            //没有点过发送数据的按钮,当点击过发送数据的按钮后cancel将会存储一个函数            //故须要在强制勾销申请时判断cancel是否是一个函数,如果是函数阐明还正在发送申请中            if (typeof cancel === 'function' ) {                cancel('强制勾销申请')            } else{                console.log('没有可勾销的申请')            }        }

以上为axios的总结啦,有帮忙的话就点个赞呗!

具体利用也能够到官网文档进行查看官网中文文档