關(guān)于前端ajax請求的優(yōu)雅方案(http客戶端為axios)
前言
AJAX,Asynchronous JavaScript and XML (異步的JavaScript和XML),一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)方案。
異步的JavaScript:
使用 【JavaScript語言】 以及 相關(guān)【瀏覽器提供類庫】 的功能向服務(wù)端發(fā)送請求,當服務(wù)端處理完請求之后,【自動執(zhí)行某個JavaScript的回調(diào)函數(shù)】。
PS:以上請求和響應(yīng)的整個過程是【偷偷】進行的,頁面上無任何感知。
下面話不多說了,來一看看本文的正文。
本文http客戶端為axios
先講個故事
類似axios這種支持Promise的API已經(jīng)很友好了,請求成功后我們可以從then的Response中拿到后端返回的數(shù)據(jù)。比如:
axios.get('/user/12345') .then((response) => { console.log(response); }) .catch((error) => { console.log(error); });
數(shù)據(jù)在response.data
中,這意味著我們每個請求都需要多做一次處理才能拿到實際的數(shù)據(jù)。
然后,實際場景后端基本不會直接把數(shù)據(jù)給我們,他會做一層封裝,比如response.data
的結(jié)構(gòu)會是這樣:
{ "date": "2017-12-14 15:21:38", "success": true, "obj": { ... }, "version": "V1.0" }
所以,response.data.obj
才是我們真正要的數(shù)據(jù)啊喂,所以我們每個請求都需要再多做一次處理=_=
突然有一天,后端說,“response.data
不再是對象,改成了JSON字符串,你做一下處理~”。
然后是的,每個接口,是每一個,我們都需要改成JSON.parse(response.data).obj
,半條命哦!
如果,后端再說,“我又改回對象了,你撤銷之前的處理吧~”。。。
如果,后端又說,“不是所有的都是對象,有一些還是JSON字符串,具體你看下更新的接口文檔~”。。。
如果,我們不曾相遇。。。
后來的我們
ES6 Proxy用于修改某些操作的默認行為,等同于在語言層面做出修改,所以屬于一種“元編程”(meta programming),即對編程語言進行編程。
Proxy可以理解成,在目標對象之前架設(shè)一層“攔截”,外界對該對象的訪問,都必須先通過這層攔截,因此提供了一種機制,可以對外界的訪問進行過濾和改寫。
要解除上述苦惱,我們需要對所有的接口請求做統(tǒng)一的封裝。如此一來,就算后端改來改去,我們只需修改一個地方甚至不用修改!
const apiService = new Proxy(axios, { get (target, propKey, receiver) { return function (...args) { return target[propKey](...args) .then((res) => { const resData = typeof res.data === 'string' ? JSON.parse(res.data) : res.data; return typeof resData.obj === 'string' ? JSON.parse(resData.obj) : resData.obj; }) .catch((err) => { throw err; }); } } });
對應(yīng)的接口請求部分改為:
apiService.get('/user/12345') .then((data) => { console.log(data); }) .catch((error) => { console.log(error); });
“你隨便改,我改一下算我輸!”
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- Vue CLI項目 axios模塊前后端交互的使用(類似ajax提交)
- Vue官方推薦AJAX組件axios.js使用方法詳解與API
- vue項目使用axios發(fā)送請求讓ajax請求頭部攜帶cookie的方法
- vue 組件的封裝之基于axios的ajax請求方法
- vue結(jié)合axios與后端進行ajax交互的方法
- 關(guān)于vue中的ajax請求和axios包問題
- vue axios 在頁面切換時中斷請求方法 ajax
- axios進階實踐之利用最優(yōu)雅的方式寫ajax請求
- 在Vue組件化中利用axios處理ajax請求的使用方法
- vue使用Axios做ajax請求詳解
- VUE 更好的 ajax 上傳處理 axios.js實現(xiàn)代碼
- Ajax常用封裝庫——Axios的使用
相關(guān)文章
ajax下載smartupload的內(nèi)容無法顯示漢字的解決方法
用ajax下載smartupload的內(nèi)容無法顯示漢字情況,大有人遇到,下面給出服務(wù)器端以及客戶端上的解決方案,感興趣的朋友不要錯過2013-11-11Ajax動態(tài)為下拉列表添加數(shù)據(jù)的實現(xiàn)方法
這篇文章主要介紹了Ajax動態(tài)為下拉列表添加數(shù)據(jù)的實現(xiàn)方法,需要的朋友可以參考下2017-01-01js裝載xml文件然后發(fā)向服務(wù)器的實現(xiàn)代碼
js裝載xml文件然后發(fā)向服務(wù)器,具體的代碼可以參考下面的思路。2009-01-01ajax、axios和fetch之間優(yōu)缺點重點對比總結(jié)
今天被問到用沒用過ajax axios,我回答經(jīng)常用axios,但ajax用的比較少,下面這篇文章主要給大家介紹了關(guān)于ajax、axios和fetch之間優(yōu)缺點重點對比總結(jié)的相關(guān)資料,需要的朋友可以參考下2022-12-12PHP+AJAX無刷新實現(xiàn)返回天氣預(yù)報數(shù)據(jù)
天氣數(shù)據(jù)是通過采集中國氣象網(wǎng)站的。本來中國天氣網(wǎng)站也給出了數(shù)據(jù)的API接口,接下來為大家介紹下用php來寫一個天氣預(yù)報的模塊,感興趣的朋友可以參考下2013-07-07