一、什么是 axios ?
axios是基於 Promise 的 ajax 封裝庫,也是前端目前最流行的 ajax 請求庫。簡單地說發送 get、post 請求,是一個輕量級的庫,使用時可直接引入。
二、axios 的特點
- 異步的 ajax 請求庫。
- 在瀏覽器端和 node 端都可以使用。
- 支持 Promise API。
- 支持請求和響應攔截。
- 響應數據自動轉換 JSON 數據。
- 支持請求取消。
- 可以批量發送多個請求。
- 客戶端支持安全保護,免受 XSRF 攻擊。
三、axios API
3.1、安裝
/* npm 安裝 */ npm install axios --save /* bower 安裝 */ bower install axios /* 使用 yarn */ yarn add axios /* cdn 引入 */ <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
注:如果簡單靜態頁面使用,建議cdn方式引入。
3.2、axios API
向 axios 傳輸相關配置參數,創建請求。如:axios(config)
/* 如發送一個post請求的配置參數如下 */ axios({ method: 'post', //請求方法 url: '/user/12345', //訪問接口 data: { //傳輸數據 firstName: 'Fred', lastName: 'Flintstone' } }); /* 如發送一個get請求的配置參數如下 */ axios({ method: 'get', url: 'http://localhost:80/one',//請求接口 responseType: 'stream'//響應形式 }) .then(function (response) { response.data.pipe(fs.createWriteStream('save.jpg')) //保存圖片 });
3.3、axios 請求方法
上邊axios API 每發起一個請求,都需要設置它的請求方法和響應頭超時等信息,使用起來比較繁瑣,為了方便,axios 為所有支持的請求方法提供了別名,可直接指定方式發起請求,其他參數可通過全局設置。如:
axios('/user/id=1');
上述 axios 直接發送請求,不設置請求方式時,默認使用 get 請求,與 ajax 和 fetch 相同。所以發送的是一個get請求,也可以使用 get 方法發送,如下實例:
axios.get( '1.txt' , { params:{id:'1'} } ).then(res=>{ console.log(res); }) .catch(err=>{ console.log(err); })
可簡寫成 axios(url,config)。
具體的其他方法分別為:
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 ]])
3.4、批量發送請求
網絡請求中往往會有多個網絡請求並發執行,有時需要統一處理它們返回結果,所以axios有並發處理。axios.all()可以並行發送多個網絡請求,等待請求都返回之后,繼續處理。
使用語法:
/* 第一種處理方式 */ axios.all([ axios.get(URL1), axios.get(URL2), ]).then(res=>{ console.log(res) //返回的res是一個數組,res[0]是第一個請求數據 res[1]是第二個請求數據 }) /* 第二種處理方式 */ axios.all([ axios.get(URL1), axios.get(URL2), ]).then( axios.spread((res1,res2)=>{ res1 //是第一個請求返回數據 res2 //是第二個請求返回數據 }) )
使用 axios.spread 能夠自動分割請求返回數據。
1.5、全局默認配置
全局默認配置主要作用於每個請求。既節省敲代碼的時間,想修改的時候,只需修改一個就可以全部修改掉。
常見的全局默認配置有:
axios.defaults.baseURL = "http://localhost:8080/" //配置域名 axios.defaults.timeout = 6000; //單位是毫秒,設置超時時間 /* 頭設置 */ axios.defaults.headers.common['Authorization'] = AUTH_TOKEN axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
3.6、axios 實例
// 實例化的時候配置默認參數 const instance = axios.create({ baseURL: 'https://api.example.com' }); // Alter defaults after instance has been created instance.defaults.headers.common['Authorization'] = AUTH_TOKEN
之所以使用 axios 實例化,是因為全局實例化 http 請求有全局的響應攔截,當我們某些接口無法返回狀態碼時,我們將無法得到 response,此時我們需要在當前 api 中重新實例化一個 axios,設置新的響應攔截碼。
3.7、攔截器
攔截器分為兩個,有請求攔截和響應攔截,可以統一處理某些業務。
- 請求攔截器:
/* 請求攔截器 統一在發送請求之前添加token */ axios.interceptors.request.use(config=>{ config.headers.token = sessionStorage.getItem("token") //添加toke return config },err=>{ console.log(err)//請求錯誤 })
- 響應攔截器
axios.interceptors.response.use(response=>{ return response },err=>{ console.log(err)//響應錯誤 })
3.8、響應內容
基本使用中,第一個實例請求成功,打印結果 console.log(res) 。返回結果如下:
{
data:{}, status:200, //從服務器返回的http狀態文本 statusText:'OK', //響應頭信息 headers: {}, //config是在請求的時候的一些配置信息 config: {} }
四、axios 常見應用
axios既可以在瀏覽器端使用,也可以在node.js中使用。在瀏覽器端發送的是XMLHttpRequest,在 node.js 發送的是 http 。像VUE、React、Node等項目都可以使用axios。