• vue中axios的介绍


     一、axiox介绍

    1、Axios特性

    • 支持Promise API
    • 拦截请求和响应
    • 转换请求数据和响应数据
    • 取消请求
    • 自动转换JSON数据
    • 客户端支持防御XSRF

    2、Axios浏览器支持

     二、基础用法(get、post、put等请求方法)

    axios的请求方法:get、post、put、patch、delete(常用的五种)

    • get:获取数据
    • post:提交数据(表单提交+文件上传)
    • put:更新数据(所有数据推送到后端)
    • patch:更新数据(只将修改的数据推送给后端)
    • delete:删除数据

     1、get:获取数据

    写法一:

    //http://localhost:8080/data.json?id=12
    axios.get('/data.json',{
      params:{
        id:12
      }
    }).then((res){
       console.log(res) 
    })

    写法二

    axios({
       method:'get',
       url:'/data.json', 
       params:{
           id:12
        } 
    }).then(res =>{
       console.log(res) 
    })    

     2、post:提交数据(表单提交+文件上传)

     写法一:

    let data = {
       id:12  
    }
    axios.post('/post',data).then(res =>{
        console.log('res) 
    })

    写法二:

    axios({
       method:'post',
       url:'/post',
       data:data  
    }).then(res=>{
       console.log(res) 
    })
    

     数据是JSON的形式

     

    form-data请求

    let formdata = new FormData()
    for(let key in data){
       formdata.append(key,data[key])
    }
    axios.post("/post",formData).then(res =>{
        console.log('res')
    })
    

     数据的形式


    3、put:更新数据(所有数据推送到后端)

    同get和post

    put与post几乎一样,只是method不一样


    4、patch:更新数据(只将修改的数据推送给后端)

    同get和post


    5、delete:删除数据

    写法一

    axios.delete('/delete',{
         params:{
             id:12
        }
    }).then(res =>{
       console.log(res)
    })
    

       

    axios.delete('/delete',{
         data:{
             id:12
        }
    }).then(res =>{
       console.log(res)
    })

     

     

    写法二

    axios({
       method:'delete',
       url:'/delete',
       params:{},
       data:{}
    }).then(res => {
       console.log(res)
    })

    什么是并发请求?

    并发请求:同时进行多个请求,并统一处理

    请求的方法:

    axios.all()

    axios.spread()

    axios.all(
        [
            axios.get('/data.json‘),
             axios.get('/city.json‘),
        ]    
    ).then(
        axios.spread((dataRes,cityRes) => {
            console.log(dataRes,cityRes)
        })
    )

    三、进阶用法(实例、配置、拦截器、取消请求等)

    1、创建axios实例

    当后端接口地址有多个,并且超时时长不一样时可以创建一个axios实例

    let instance = axios.create({
        baseURL:'http://localhost:8080',
        timeout:1000
    })
    let axios2= axios.create({
        baseURL:'http://localhost:9090',
        timeout:5000
    })
    
    instance.get('/data.json').then(res =>{
        console.log(res)
    })
    
    axios2.get('/city.json').then(res =>{
        console.log(res)
    })

    2、实例的相关配置

    axios的配置:

    axios.create({
        baseURL:'',    //请求的域名,基本地址
        timeout:1000,    //超时时长(ms)
        url:'/data.json' ,  //请求路径
        method:’get‘ ,  //请求方法   get/post/pu/patch/delete
        headers:{    //请求头
            token:' '
        },
         params:{},    //请求参数拼接在url上
         data:{},       //请求参数放在请求体
    })
    
    axios.get('/data.json',{
       params:{
            id:12
        }
    })    
    

     axios.get('/data.json',{}),有两个参数,第二个参数就是写axios实例的相关配置的 

    • axios全局配置
    • axios实例配置
    • axios请求配置

    1、axios全局配置

    axios.defaulte.timeout = 1000
    axios.defaulte.baseURL = 'http://localhost:8080'
    

      一般全局配置都只是修改这两个参数

    2、axios实例配置

    let instance  = axios.create()
    instance.defaults.timeout = 3000    
    

    3、请求配置

    instance.get('data.json',{
        timeout:5000
    }) 
    

      优先级:请求配置 >  实例配置 > 全局配置 


    3、在实际开发中

    实例1:

    有两种请求接口:http:localhost:9090 、http:localhost:9091

    let instance = axios.create({
        baseURL:'http:localhost:9090',
        timeout:1000
    })
    let instance1 = axios.create({
        baseURL:'http:localhost:9091',
        timeout:3000
    })
    
    instance.get('/contactList',{
       params:{  id:12 }    
    }).then((res) =>{
       console.log(res)
    })//此实例应用到了baseURL,timeout,url,method,params

    实例2:

    只有一个方法的数据量很大时,修改此方法的超时时长

    instance1.get('/contactList',{
      timeout:5000
    }).then((res) =>{
       console.log(res)
    })
    //此实例应用到了baseURL、timeout:5000、method、url

    4、拦截器  

    拦截器: 在请求或响应被处理前拦截它们

    • 请求拦截器
    • 响应拦截器

    请求拦截器

    axios.interceptors.request.use
    (config =>{
         //在发送请求前做些什么
         return config
    }) ,err=>{
         //在请求错误的时候做些什么
         return Promise.reject(err)
    }
    

    响应拦截器

    axios.interceptors.response.use
    (res =>{
         //请求成功对响应数据作处理
         return res    //这里的res返回后是axios.get().then(res=>{})中的res
    }),errr=>{
          //响应错误做写什么
          return Promise.reject(err)    //这里的err返回后是axios.get().then().catch(err =>{})中的err
    }

    取消拦截器(了解,一般情况下不会取消拦截器的)

    let interceptors = axios.interceptors.request.use
    (config =>{
        config.headers= {
               auth:true
         }
         return config
    })
    
    axios.interceptors.request.eject(interceptors)

    5、错误处理

    axios.get('/data.json').then((res) =>{
       console.log(res)
    }).catch(err =>{
       console.log(err)
    })
    

     实例:实际开发过程中,一般添加统一错误处理

    错误处理---请求拦截器

    let instance = axios.create({})
    instance.interceptors.request(config =>{
        return config
    },err=>{
       //一般请求错误http状态码以4开头,常见:401 超时;404   not found 
       $('#modal').show()
        setTimeout(() =>{
            $('#modal').hide()
        },200)
       return Promise.reject(err)
    })

      错误处理---响应拦截器

    instance.interceptors.response.use(res =>{
        return res
    },err=>{
      //一般响应错误http状态码以5开头,常见:500 系统错误;502系统重启
       $('#modal').show()
       setTimeout(() =>{
          $('#modal').hide()
       },200)
       return Promise.reject(err)
    })

     取消请求(了解,几乎用不到)

     四、axios进一步封装,在项目中的实际应用

     axios的封装(重点)

    1. 统一管理url
    2. 对请求统一的封装

    一、新建文件  /service/contactApi.js

    const CONTACT_API = {
         //例子:获取联系人列表
         getContactList:{
            method:'get',
            url:'/contactList'
        }
        //例子:新建联系人   from-data
         newContactForm:{
            method:'post',
            url:'/contact/new/form'
        }
       //例子:新建联系人   application/json
         newContactJson:{
            method:'post',
            url:'/contact/new/json'
        }
         //例子:编辑联系人  
         editContact:{
            method:'put',
            url:'/contact/edit'
        }
        //例子:删除联系人
         deleteContact:{
            method:'delete',
            url:'/contact'
        }
    }    
    export default CONTACT_API

    二、封装axios,新建/service/http.js

    import axios from 'axios'
    import service from './contactApi'
    import Toast from 'Vant'
    //service循环遍历输出不同的请求方法
    let instance = axios.create({
         baseURL:'http://localhost:9000/api',
         timeout:1000
    })
    
    const Http = {}   //包裹请求方法的容器
    
    //请求格式/参数的统一
    for(let key in service){   //这里的key代表的是newContactJson,editContact等
        let api = service[key];    //url  method
         //async作用:避免进入回调地狱
        Http[key] =  async function(
            params,   //请求参数 get:url,put,post,patch(data), delete:url
            isFormData = false,    //标识是否是form-data请求
            config={}    //配置参数
        ){  
             let newParams = {}
             //content-type是否是form-data的判断
             if(params && isFormData){
                   newParams = new FormData()
                   for(let i in params){
                        newParams.append(i,params[i])
                   }
             }else{
                    newParams = params
             }
            let response = {}   //请求的返回值
             //不同请求的判断
            if(api.method === 'put' || api.method === 'post' || api.method === 'patch'){
              try{
                  response = await instance[api.method](api.url,newParams,config)
               }catch(err){
                   response = err
               }
            }else if(api.method === 'delete' || api.method === 'get'){
                  config.params = newParams
                  try{
                      response = await instance[api.method](api.url,config)
                  }catch(err){
                      response = err
                  }
            }
            return response;     //返回请求的响应值
        }
    } 
    
    
    //拦截器的添加
    //请求拦截器
    instance.interceptorswx.request(config=>{
      //发起请求前做些什么
       Toast.loading({
         mask:false,
         duration:0, //一直存在
         forbidClick:true,//禁止点击
         message:'加载中...'
       })
       return config
    },()=>{
      //请求错误
      Toast.clear()//清楚轻提示
      Toast('请求错误,请稍后重试')
    })
    
    // 响应拦截器
    instance.interceptors.response.use(res=>{
      //请求成功
      Toast.clear()
      return res.data
    },()=>{
      //请求错误
      Toast.clear()//清楚轻提示
      Toast('请求错误,请稍后重试')
    })
    
    export default Http

    三、调用Http

    在main.js

    import Http from './service/http'
    //把Http挂载到Vue实例上
    Vue.prototype.$Http = Http

    四、使用接口

     methods:{
        // 查询
        async getList(){
          let res = await
          this.$Http.getContactList()
          this.list = res.data
        }

    五、扩展

     

  • 相关阅读:
    渗透测试中的文件传输通道1- cmd下下载文件
    内网渗透常用命令
    技术剖析中国菜刀原理
    win8 iis安装及网站发布
    C++与C的区别一
    C语言实现单链表,并完成链表常用API函数
    C语言实现数组及链表的快速排序
    使用C语言封装数组,动态实现增删改查
    C语言中静态断言的使用
    二分查找法C语言实现
  • 原文地址:https://www.cnblogs.com/meiyanstar/p/13920154.html
Copyright © 2020-2023  润新知