返回旧版| 微信建站| 我要建站 | 建站学习 | 加入收藏
js教程当前位置:首页 > HTML教程 > js教程 > 正文

axios使用教程

发布时间:2020-08-31 11:39:14   来源:   点击:
安装axios
  1. npm install axios --save 
  2. bower install axios --save 

引用
直接script标签引用
  1. <script src="https://unpkg.com/axios/dist/axios.min.js"></script> 
ES6 import引用
因为axios不是vue的插件,所以不能直接用use方法,需要将其加载到原型上。
  1. import axios from 'axios' 
  2. axios.get(); 
如果要全局使用axios就需要在main.js中设置成全局的,然后再组件中通过this调用

  1. Vue.prototype.$axios = axios; 
  2. this.$axios.get(); 

使用
发送一个最简单的请求
这里我们发送一个带参数的get请求,params参数放在get方法的第二个参数中,如果没有参数get方法里可以只写路径。如果请求失败捕获一下异常。
  1. axios 
  2.   .get('http://rap2api.taobao.org/app/mock/23080/resources/search',{ 
  3.       params: { 
  4.          id: 5 
  5.       } 
  6.    }) 
  7.   .then(res => { 
  8.     console.log('数据是:', res); 
  9.   }) 
  10.   .catch((e) => { 
  11.     console.log('获取数据失败'); 
  12.   }); 

当然,我们也可以发送一个POST请求,post方法的第二个参数为请求参数对象。
  1. this.$axios.post('http://rap2api.taobao.org/app/mock/121145/post',{ 
  2.   name: '小月' 
  3. }) 
  4. .then(function(res){ 
  5.   console.log(res); 
  6. }) 
  7. .catch(function(err){ 
  8.   console.log(err); 
  9. }); 

一次合并发送多个请求
分别写两个请求函数,利用axios的all方法接收一个由每个请求函数组成的数组,可以一次性发送多个请求,如果全部请求成功,在axios.spread方法接收一个回调函数,该函数的参数就是每个请求返回的结果。

  1. function getUserAccount(){ 
  2.   return axios.get('/user/12345'); 
  3. function getUserPermissions(){ 
  4.   return axios.get('/user/12345/permissions'); 
  5. this.$axios.all([getUserAccount(),getUserPermissions()]) 
  6.   .then(axios.spread(function(res1,res2){ 
  7.     //当这两个请求都完成的时候会触发这个函数,两个参数分别代表返回的结果 
  8. })) 

axios的API
以上通过axios直接调用发放来发起对应的请求其实是axios为了方便起见给不同的请求提供的别名方法。我们完全可以通过调用axios的API,传递一个配置对象来发起请求。

发送post请求,参数写在data属性中
  1. axios({ 
  2.   url: 'http://rap2api.taobao.org/app/mock/121145/post'
  3.   method: 'post'
  4.   data: { 
  5.     name: '小月' 
  6.   } 
  7. }).then(res => { 
  8.   console.log('请求结果:', res); 
  9. }); 

发送get请求,默认就是get请求,直接第一个参数写路径,第二个参数写配置对象,参数通过params属性设置。
  1. axios('http://rap2api.taobao.org/app/mock/121145/get', { 
  2.   params: { 
  3.     name: '小月' 
  4.   } 
  5. }).then(res => { 
  6.   console.log('请求结果:', res); 
  7. }); 

axios为所有请求方式都提供了别名:

axios.request(config)

axios.get(url, [config])

axios.delete(url, [config])

axios.head(url, [config])

axios.options(url, [config])

axios.post(url, [data], [config])

axios.put(url, [data], [config])

axios.patch(url, [data], [config])

axios配置默认值
1、可以通过axios.defaults设置全局默认值,在所有请求中都生效。
  1. axios.defaults.headers.common["token"] = "" 
  2. axios.defaults.headers.post["Content-type"] = "application/json" 
  3. axios.defaults.baseURL = 'https://service.xxx.com; //设置统一路径前缀 

2、也可以自定义实例的默认值,以及修改实例的配置
  1. // 创建时自定义默认配置,超时设置为全局默认值0秒 
  2. let ax = axios.create({ 
  3.   baseURL: 'http://rap2api.taobao.org'
  4.   params: { name: '小月' } 
  5. }); 
  6. // 修改配置后,超时设置为4秒 
  7. ax.defaults.timeout = 4000; 

3、也可以像前面那样,在每个请求中设置相关的配置。
  1. axios('/app/mock/121145/get', { 
  2.   params: { 
  3.     name: 'xiaoxiao' 
  4.   }, 
  5.   baseURL: 'http://rap2api.taobao.org' 
  6. }) 

以上配置方法优先级从1-3依次增高,更多配置选项查看文档。
  1.     method:'请求方法'
  2.     baseURL:'如果路径不是绝对路径,就会在路径前自动添加此路径'
  3.     transformRequest: [(data, header)=>{}], //在发送请求之前修改数据,适用于post、put、patch 
  4.     transformResponse:  [(data)=>{ 
  5.         return JSON.parse(data).data; 
  6.     }], //在收到的数据传到then之前修改数据,注意这里data是个字符串类型。 
  7.     header: {'X-Requested-With''XMLHttpRequest'}, //请求头 
  8.     params: {}, //请求参数 
  9.     paramsSerializer: (params)=>{ 
  10.         return qs.stringify(params); //name=xiaohong&id=1 
  11.     } //可选函数,可以把参数拼接成字符串 
  12.     data: {}, // post类方法的请求体参数 
  13.     timeout: 0, //请求延时事件,如果超时请求终止 
  14.     withCredentials: false//是否时跨站点请求 
  15.     onUploadProgress: (progressEvent)=>{ 
  16.         //可以通过progressEvent拿到上传的进度 
  17.     }, 
  18.     onDownloadProgress: ()=>{},//和onUploadProgress一样,获取下载的进度 
  19.     responseType: json,  // 返回的数据格式 
  20.     maxContentLength: 2000, //相应内容的最大尺寸 
  21.     validateStatus: (validateStatus)=>{ 
  22.         return validateStatus >= 200; //限制相应状态码,如果不满足就拒绝 
  23.     }, 
  24.     cancelToken: new cancelToken(function(cancel){}) // 指定一个取消请求标识,下面会用到 

拦截器
可以分别设置请求拦截和响应拦截,在发出请求和响应到达then之前进行判断处理。
  1. axios.interceptors.response.use( 
  2.   res => { 
  3.     if (res) { 
  4.       return res; 
  5.     } 
  6.   }, 
  7.   err => { 
  8.     return Promise.reject(error); 
  9.   } 
  10. ); 

以上以相应拦截器为例,请求拦截器同样,只是把response换成request。第一个参数是成功回调,第二个是错误回调。
也可以移除拦截器,就像移除js定时器一样的操作:
  1. var myInterceptor = axios.interceptors.request.use(function () {/*...*/}); 
  2. axios.interceptors.request.eject(myInterceptor); 

取消请求
1、取消请求的话需要先通过创建一个CancelToken.source工厂函数创建一个标识source
2、通过配置项制定标识,这样才知道取消的是哪个请求
3、调用取消方法
  1. var CancelToken = axios.CancelToken; 
  2. var source = CancelToken.source(); //1 
  3. axios.post('/user/12345', { 
  4.   name: 'new name' 
  5. }, { 
  6.   cancelToken: source.token //2 
  7. }) 
  8. source.cancel('Operation canceled by the user.'); //3 

还有一种写法是直接把cancelToken的构造函数传递给配置项,该构造函数接受一个函数作为参数,在这个函数中指定标识符。
  1. var CancelToken = axios.CancelToken; 
  2. var cancel; 
  3. axios.get('/app/mock/121145/get', { 
  4.   baseURL: 'http://rap2api.taobao.org'
  5.   cancelToken: new CancelToken(function executor(c) { 
  6.     cancel = c; 
  7.   }) 
  8. }); 
  9. cancel(); 

跨域配置
如果我们要跨域请求数据,在配置文件里设置代理,vue-cli3项目,需要在根目录自己创建一个vue.config.js,在里面写配置。
  1. module.exports = { 
  2.   devServer: { 
  3.     proxy: { 
  4.       '/api': { 
  5.         target: 'https://www.xxx.com', //目标路径,别忘了加http和端口号 
  6.         changeOrigin: true//是否跨域 
  7.         ws: true
  8.         pathRewrite: { 
  9.           '^/api''' //重写路径 
  10.         } 
  11.       } 
  12.     } 
  13.   } 
  14. }; 

调用接口:
axios.post('/api/test', {name: 'xiao'});
如果没有重写路径,访问的就是https://www.xxx.com/api/test,如果像上面代码那样重写路径访问的就是https://www.xxx.com/test。

原理:
因为客户端请求服务端的数据是存在跨域问题的,而服务器和服务器之间可以相互请求数据,是没有跨域的概念(如果服务器没有设置禁止跨域的权限问题),也就是说,我们可以配置一个代理的服务器可以请求另一个服务器中的数据,然后把请求出来的数据返回到我们的代理服务器中,代理服务器再返回数据给我们的客户端,这样我们就可以实现跨域访问数据啦。

作者:Iam_Bling
链接:https://www.jianshu.com/p/f959366fadb8

版权所有:郑州腾石网络科技有限公司 备案信息:豫ICP备18019117号
站长QQ:2863868475 业务合作咨询:15137100750(同微信)
本站所有投放的广告是有其他网站提供,不代表本站立场,同时网站首页广告位对外出租详情咨询本站站长!同时欢迎广大站长加入个人建站团队
  • 建站客服
  • CMS仿站
  • CMS学习
  • 技术交流群:336572814