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
 }

  

posted @ 2020-03-15 21:21  钟小嘿  阅读(331)  评论(0编辑  收藏  举报