特點:支持promise API 、 攔截請求和響應、轉換請求數據和響應數據、取消請求、自動轉換JSON數據、客戶端支持防御XSRF等;
axios請求方法(需后端定義):get獲取數據、 post提交數據(用於表單提交和文件上傳)、 patch更新(只將修改的數據推送到后端)、 put更新(所有數據都推送到后端)、 delete刪除數據
例如:axios_test.vue:
<script> export default{ name:'axios_test', components:{}, created(){ //get axios.get('/data.json',{params:{id:12,name:'zs'}}).then((res)=>{ console.log(res); }) 或:axios({ method:'get', url:'/data.json', params:{ id:12, name:'zs' } }).then((res)=>{ console.log(res); }) //post axios.post('/xxx').then({ // 默認application/json常用,用於沒有上傳文件時,用法同上不詳寫了 // form-data 表單提交(用於文件上傳) let data = { id:12} let formData = new FormData() for(let key in data){ formData.append(key,data[key]); } axios.post('post',formData).then(res=>{ console.log(res) }) }) //put/patch axios.put('/put',data).then(res=>{ console.log(res); }) //delete axios.delete('/delete',{ params:{id:12}}).then(res=>{}) //實則底層調用get請求,params數據將添加到url中去; axios.delete('/delete',{ data:{id:12}}).then(res=>{}) //實則底層調用post請求,data數據將放在請求體中; //並發請求:同時進行多個請求,並統一處理返回值。 axios.all()和axios.spread() axios.all([ axios.get('/data.json'), axios.get('/city.json') ]).then( axios.spread((dataRes,cityRes)=>{ console.log(dataRes,cityRes); }) ) //創建axios實例 let instance = axios.create({ //設置后會覆蓋以前的設置 baseURL:'http://localhost:8080', timeout:1000, url:'/data.json', method:'get/post/put/patch/delete', headers:{token:''}, //設置請求頭 params:{}, //請求參數拼接到url上 data:{} //請求參數放到請求體中 }) let instance2 = axios.create() instance.get('/data.json').then(res=>{}) //1、axios全局配置 axios.defaults.timeout = 1000; axios.defaults.baseURL = 'http://localhost:8080' //2、axios實例配置(常用方式) let instance = axios.create() //單獨創建防止全局污染 instance.defaults.timeout=3000 //單獨設置防止覆蓋其他設置 //3、axios請求配置 (三種方式中優先級最高) instance.get('/data.json',{ time:5000 }) //攔截器:在請求或響應被處理前攔截它們,分為請求攔截器和響應攔截器 //請求攔截器 axios.interceptors.request.use(config=>{ //在發送請求前做些什么 return config },err=>{ //在請求發生錯誤時怎么處理 return Promise.reject(err) }) //響應攔截器 axios.interceptors.response.use(config=>{ //請求成功對響應數據做處理 return res },err=>{ //在響應發生錯誤時怎么處理 return Promise.reject(err) }) //取消攔截器(了解) let interceptor = axios.interceptors.request.use(config=>{ config.headers={ auto:true} return config }) axios.interceptors.request.eject(interceptor); //攔截器例子1:比如微博評論時需要先登錄 let instance = axios.create({}) instance.interceptors.request.use(config=>{ config.headers.token = ''; return config }) //攔截器例子2:移動端開發時的請求等待 let instance_phone = axios.create({}) instance_phone.interceptors.request.use(config=>{ $('#modal').show() // 請求等待彈窗 return config }) instance_phone.interceptors.response.use(res=>{ $('#modal').hide() // 請求等待彈窗隱藏 return res }) //錯誤處理 實際開發中,一般添加統一錯誤處理,特殊的單獨添加。 //添加請求錯誤處理攔截器 let instance = axios.create({}) instance.interceptors.request(config=>{ return config },err=>{ //請求錯誤 一般http狀態碼以4開頭,常見:401超時,404 沒找到 $('#modal').show() setTimeout(()=>{ $('#modal').hide() },2000) return Promise.reject(err) }) //添加響應錯誤處理攔截器 instance.interceptors.response(res=>{ return res },err=>{ //響應錯誤 一般http狀態碼以5開頭,常見:500系統錯誤,502系統重啟 $('#modal').show() setTimeout(()=>{ $('#modal').hide() },2000) return Promise.reject(err) }) //添加特殊錯誤處理 instance.get('/data.json').then(res=>{ console.log(res) }).catch(err=>{ console.log(err) }) //取消請求(了解) let source = axios.CancelToken.source() axios.get('data.json',{cancelToken:source.token}).then() source.cancel('cancel http') //取消請求(message可選) 比如當用戶查詢數據耗時太久,用戶不再查詢進行了其他操作時可能用到,一般用不到。 } } </script>
axios實戰:移動端UI的vant使用和axios的封裝:
①npm i vant
②npm i ts-import-plugin -D
③按照 API文檔的快速上手提示,在 babel.config.js 中配置
module.exports = { plugins: [ ['import', { libraryName: 'vant', libraryDirectory: 'es', style: true }, 'vant'] ] };
④ 引入 Vant 組件
test.vue:
<template> <van-button type="default">默認按鈕</van-button> </template> <script> import axios from 'axios' import {Button} from 'vant' export default { name:'showlist', components:{ [Button.name]=Button //局部注冊,template模板中沒有引用時可不寫,vant官方格式。 }, created(){ axios.get(./data.json).then((res)=>{ console.log(res) }) } } </script>
⑤ router.js中添加一條路由:{path:'/showlist',name:'',component:()=>import('./views/showlist.vue')}
⑥ npm run serve 啟動服務測試
axios的封裝 示例
①contactApi.js: const CONTACT_API = { //獲取聯系人列表 getContactList:{ method:'get', url:'/contactList' }, //新建聯系人 form-data newContactForm:{ method:'post', url:'/contact/new/form-data' }, //新建聯系人 application/json newContactJson:{ method:'post', url:'/contact/new/json' }, //編輯聯系人 editContact:{ method:'put', url:'/contact/edit' }, //刪除聯系人 delContact:{ method:'delete', url:'/contact' }, } export default CONTACT_API ②http.js: import axios from 'axios' import service from './contactApi.js' import {Toast} from 'vant' //service循環遍歷,輸出不同的請求方法 let instance = axios.create({ baseURL:'http://localhost:9000/api', timeout:1000 }) const Http = {}; //存放請求方法的容器 for(let key in service){ let api = service[key]; //url、method Http[key] = async function( params, //請求參數 isFormData = false, //標識是否是form-data請求 config={} //配置參數 ){ let newParams = {} 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.interceptors.request.use(config=>{ Toast.loading({ mask:false, //是否有陰影 duration:0, //一直存在 forbidClick:true, //禁止點擊 message:'加載中...' }) return config },err=>{ Toast.clear() Toast('請求錯誤,請稍后重試') }) //響應攔截器 instance.interceptors.response.use(res=>{ Toast.clear() return res.data },()=>{ Toast.clear() Toast('請求錯誤,請稍后重試') }) export default Http ③main.js文件中引入http.js,並將其掛載到vue實例上,引入后添加如下: Vue.prototype.$http = Http; ④vue組件中使用: <script> import axios from 'axios' import {Button} from 'vant' export default { name:'showlist', components:{ [Button.name]=Button //局部注冊,template模板中沒有引用時可不寫。 }, methods:{ //獲取聯系人列表 async getList(){ let res = await this.$http.getContact() this.list = res.data } } } </script>