zoukankan      html  css  js  c++  java
  • axios基础

    1.定义

    axios多用于vue中,作为网络应用。

    2.基本语法

    2.1get请求语法

    1)原生写法:

    axios({
      url:url,
      method:'get',
      params:请求参数,
    }).then(res => {
        //成功的处理
    }).catch(err => {
       //失败的处理
    })

    对于原生的写法,请求参数都是一个对象,而且格式比较麻烦,因此axios自己就进行了简写,有了下面的写法。

    2)简写

    axios.get(url,[options]).then(res => {
       //成功的处理
    },err => {
        //失败的处理
    }

    get如果需要传递options参数,那么写法为{ params: { 参数名称:参数值 } }

    2.2post请求语法

    原生写法:

    axios({
      url:url,
      method:'post',
      data:请求参数,
    }).then(res => {
        //成功的处理
    }).catch(err => {
       //失败的处理
    })

    传递的参数前面的data,这种方式传递的参数到后台是一个json对象,后台就必须使用@RequestBody进行接收。如果想要和get请求一样接收参数,那么就使用params,而不使用data,此时就会把参数拼接在地址栏,但是方法必须是post:

    axios({
      url:url,
      method:'post',
      params:请求参数,
    }).then(res => {
        //成功的处理
    }).catch(err => {
       //失败的处理
    })

    简写:

    axios.post(url,[body]).then(res => {
       //成功的处理
    },err => {
        //失败的处理
    }

    post的传递参数是对象。

    2.3delete请求语法

    axios.delete(url+'/'+options).then(res => {
       //成功的处理
    },err => {
        //失败的处理
    }

    2.4并发请求all

    当需要多个请求同时请求时,可以使用all。不常用。

    axios.all([网络请求1, 网络请求2])
      .then(axios.spread((res1, res2) => {
        console.log(res1)
        console.log(res2)
      })
    )

    3.基本使用

    先创建一个vue的项目,名字为axios-demo,删除HelloWord.vue文件,接下来请看以下步骤。

    3.1安装axios

    在根目录执行

    npm i axios -S

    3.2get请求测试

    在main.js中导入axios,然后使用

    import Vue from 'vue'
    import App from './App.vue'
    
    import axios from 'axios'
    
    Vue.config.productionTip = false
    
    new Vue({
      render: h => h(App),
    }).$mount('#app')
    
    axios.get('https://autumnfish.cn/api/joke/list', {
      //传递参数,如果没有参数则省略这个对象即可
      params: {
        num: 5
      }
    }).then(res => {
      console.log(res.data)
    }, err => {
      console.log(err)
    })

    3.3post请求测试

    axios.post('https://autumnfish.cn/api/user/reg',{
      username:'123456556'
    }).then(res => {
      console.log(res.data)
    }, err => {
      console.log(err)
    })

    3.5全局配置

    在3.2和3.3测试中,会发现请求的url的前面一部分都是相同的,那么就可以进行全局配置

    axios.defaults.baseURL = 'https://autumnfish.cn/api'

    对post请求统一设置请求类型

    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-rulencode'

    统一设置请求超时时间

    axios.defaults.timeout = 时间    //单位是ms

    4.创建axios实例

    后端的服务器可能有多个,那么全局配置就不好用了,就可以创建自己的实例来进行配置。

    const instance1 = axios.create({
      baseURL: 'baseUrl',
      timeout: 5000
    })

    使用实例:和全局的用法一样。如果是多个服务器就创建多个实例即可。

    instance1.get(url,[options]).then(res => {},err => {})

    5.拦截器

    拦截器分为请求拦截和响应拦截。请求拦截一般用在请求时携带验证信息,响应拦截主要是返回有用的数据。

    //请求拦截
    axios.interceptors.request.use(
        config => {
          return config
        }, err => {
          return err 
        }
      )
    //响应拦截
    axios.interceptors.response.use(
        res => {
          return res
        }, err => {
          return err 
        }
      )

    请求拦截使用场景:在请求的时候添加请求头headers信息(通过config.headers进行设置)。

    6.vue封装axios

    在很多地方如果直接使用第三方axios,需要都导入,对它的依赖性太强,难以维护,对它封装就很有意义。

    创建文件src/network/request.js

    import axios from 'axios'
    const instance = axios.create({
        baseURL: '/api',
        timeout: 5000
    })
    //请求拦截
    instance.interceptors.request.use(
        config => {
            return config
        }, err => {
            return Promise.reject(err)
        }
    )
    //响应拦截
    instance.interceptors.response.use(
        res => {
            // 不拦截下载流文件
            const contentType = res.headers['content-type'].toLowerCase()
            if (contentType === 'application/octet-stream;charset=utf-8' || contentType === 'arrayBuffer;charset=UTF-8') {
                return res
            }
            return res.data
        }, err => {
            if (err.response) {
                switch (err.response.status) {
                    case 401: console.log('无权限')
                 }
            }
            return Promise.reject(err.response.data)
        }
    )
    
    //方法封装
    const request = {
        get(url, params) {
            return new Promise((resolve, reject) => {
                instance.get(url, {
                    params: params
                }).then(res => {
                    resolve(res);
                }).catch(err => {
                    reject(err)
                })
            });
        },
        post(url, params) {
            return new Promise((resolve, reject) => {
                instance.post(url, params)
                    .then(res => {
                        resolve(res);
                    })
                    .catch(err => {
                        reject(err)
                    })
            });
        },
        postParam(url, data) {
            const keys = Object.keys(data)
            let params = ''
            for (let i = 0; i < keys.length; i++) {
                const key = keys[i]
                let value = data[key]
                if (value != null && value != '') {
                    if (i != 0) {
                        params += '&'
                    }
                    //对特殊字符进行转义
                    value = encodeURIComponent(value)
                    params += key + '=' + value
                }
    
            }
            return new Promise((resolve, reject) => {
                instance.post(url, params)
                    .then(res => {
                        resolve(res);
                    })
                    .catch(err => {
                        reject(err)
                    })
            });
        },
        put(url, params) {
            return new Promise((resolve, reject) => {
                instance.put(url, params)
                    .then(res => {
                        resolve(res);
                    })
                    .catch(err => {
                        reject(err)
                    })
            });
        },
        delete(url) {
            return new Promise((resolve, reject) => {
                instance.delete(url)
                    .then(res => {
                        resolve(res);
                    })
                    .catch(err => {
                        reject(err)
                    })
            });
        },
        //用于下载文件
        postDownload(url, params) {
            return new Promise((resolve, reject) => {
                instance.request({
                    url: url,
                    method: 'POST',
                    data: params,
                    responseType: 'arraybuffer'
                })
                    .then(res => {
                        resolve(res);
                    })
                    .catch(err => {
                        reject(err)
                    })
            });
        },
    }
    
    
    
    
    export default request

    这里并没有设置请求后台的具体路径,这个在vue.config.js中进行配置。如果需要token,那么设置即可。对于下载文件,一般使用post请求,同时设置响应类型是arraybuffer。对于拦截器的错误状态,可根据需求进行处理,上述只写了一个作为模板。

    在main.js中导入使用

    import Vue from 'vue'
    import App from './App.vue'
    
    import request from './network/request'
    
    Vue.config.productionTip = false
    
    new Vue({
      render: h => h(App),
    }).$mount('#app')
    
    request.get('joke/list', {
        num: 5
      }
    ).then(res => {
      console.log(res)
    }, err => {
      console.log(err)
    })
    request.post('user/reg', {
      username: '123456556'
    }).then(res => {
      console.log(res)
    }, err => {
      console.log(err)
    })

    7.axios传递数组

    7.1get请求传递数组

    const arr = [1,2,3]
    axios.get('api/test',arr.toString()).then(res=>{
      console.log(res)
    }).catch(err=>{console.log(err)})

    get方式传递数组,需要把数组转为字符串传递,不能直接传递数组给后台。后台接收:

    @GetMapping("/api/testt")
    public void get(String array){
        System.out.println(arrar);//1,2,3
    }

    后台接收后是一个字符串,通过逗号进行分隔。

    7.2delete请求传递数组

    对于delete请求传递数组,不需要转换,直接传递即可。

    const arr = [1,2,3]
    axios.delete('api/'+arr).then(res=>{
      console.log(res)
    }).catch(err=>{console.log(err)})

    后台接收:

     @DeleteMapping("/api/{arr}")
     public void delete(@PathVariable("arr")String arr){
          System.out.println(arr);//1,2,3
     }

      

    就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
  • 相关阅读:
    json数据转化格式
    远程安装软件控制台
    杂、记忆点
    布局(杂,细节处理)
    自己修改代码后push推送到zhile
    js中call和apply的区别 / 函数的call、apply以及bind的作用与区别
    一元运算符a++、++a、a--、--a
    javascript基础语法和算术运算符
    不同空格符号的区别
    2020.12.11面试两家
  • 原文地址:https://www.cnblogs.com/zys2019/p/12500124.html
Copyright © 2011-2022 走看看