日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
項(xiàng)目實(shí)踐-Axios進(jìn)階封裝

 axios二次封裝解決了什么問(wèn)題?(項(xiàng)目常用)

發(fā)展壯大離不開(kāi)廣大客戶長(zhǎng)期以來(lái)的信賴與支持,我們將始終秉承“誠(chéng)信為本、服務(wù)至上”的服務(wù)理念,堅(jiān)持“二合一”的優(yōu)良服務(wù)模式,真誠(chéng)服務(wù)每家企業(yè),認(rèn)真做好每個(gè)細(xì)節(jié),不斷完善自我,成就企業(yè),實(shí)現(xiàn)共贏。行業(yè)涉及酒樓設(shè)計(jì)等,在成都網(wǎng)站建設(shè)、全網(wǎng)整合營(yíng)銷推廣、WAP手機(jī)網(wǎng)站、VI設(shè)計(jì)、軟件開(kāi)發(fā)等項(xiàng)目上具有豐富的設(shè)計(jì)經(jīng)驗(yàn)。

axios二次封裝:就是把大部分接口公共的參數(shù)配置提取出來(lái)統(tǒng)一進(jìn)行處理。

1、代碼封裝,重用性高,減少代碼量,減低維護(hù)難度。

2、統(tǒng)一處理一些常規(guī)的問(wèn)題一勞永逸,如http錯(cuò)誤。

3、攔截請(qǐng)求和響應(yīng),提前對(duì)數(shù)據(jù)進(jìn)行處理,如獲取token,修改配置項(xiàng)。

Axios基礎(chǔ)配置- 實(shí)踐

1) 全局的 axios 默認(rèn)值

 
 
 
 
  1. axios.defaults.baseURL = 'https://api.cdxwcx.com';
  2. axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
  3. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

2) 自定義實(shí)例默認(rèn)值

 
 
 
 
  1. // 創(chuàng)建實(shí)例時(shí)設(shè)置配置的默認(rèn)值
  2. var instance = axios.create({
  3.   baseURL: 'https://api.cdxwcx.com'
  4. });
  5. // 在實(shí)例已創(chuàng)建后修改默認(rèn)值
  6. instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

3) 區(qū)分環(huán)境配置

 
 
 
 
  1. let env = "dev";
  2. switch (env) {
  3.     case 'dev':
  4.         axios.defaults.baseURL = "http://127.0.0.1:8888";
  5.         break;
  6.     case 'test':
  7.         axios.defaults.baseURL = "http://114.27.34.1:8888";
  8.         break;
  9.     case 'pro':
  10.         axios.defaults.baseURL = "http://api.zhufeng.cn";
  11.         break;
  12. }

4) 數(shù)據(jù)格式配置

 
 
 
 
  1. axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';
  2. // axios.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded';
  3. // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  4. axios.defaults.transformRequest = function (data, headers) {
  5.     let ContentType = headers['Content-Type'] || headers.common['Content-Type'] || headers.post['Content-Type'] || 'application/json';
  6.     if (ContentType === "application/json") {
  7.         return JSON.stringify(data);
  8.     }
  9.     if (ContentType === "application/x-www-form-urlencoded") {
  10.         return Qs.stringify(data);
  11.     }
  12.     return data;
  13. };

項(xiàng)目實(shí)踐-數(shù)據(jù)格式

 
 
 
 
  1. service.interceptors.request.use(
  2.   (config) => {
  3.     // 開(kāi)發(fā)環(huán)境引入包裝api
  4.     config.url = `${BASE_URL}${config.url}`;
  5.     config.headers['Cache-Control'] = 'no-cache,no-store,must-revalidate,max-age=-1,private';
  6.     // post請(qǐng)求并且需要將data以form data 形式傳給后端 需要傳一個(gè)formType為true boolean
  7.     if (config.method === 'post' && config.formType === true) {
  8.       config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
  9.       config.data = qs.stringify(config.data);
  10.     }
  11.     return config;
  12.   },
  13.   (error) => {
  14.     // Do something with request error
  15.     Promise.reject(error);
  16.   }
  17. );

5) 攔截器

 
 
 
 
  1. // 添加請(qǐng)求攔截器
  2. axios.interceptors.request.use(function (config) {
  3.     // 在發(fā)送請(qǐng)求之前做些什么
  4.     return config;
  5. }, function (error) {
  6.     // 對(duì)請(qǐng)求錯(cuò)誤做些什么
  7.     return Promise.reject(error);
  8. });
  9. // 添加響應(yīng)攔截器
  10. axios.interceptors.response.use(function (response) {
  11.     // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么
  12.     return response;
  13. }, function (error) {
  14.     // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么
  15.     return Promise.reject(error);
  16. });

6) 響應(yīng)的錯(cuò)誤處理封裝

interceptor作用就是攔截,可以針對(duì)請(qǐng)求參數(shù)和響應(yīng)結(jié)果進(jìn)行攔截處理,一般在項(xiàng)目當(dāng)中,主要針對(duì)接口常規(guī)報(bào)錯(cuò)、網(wǎng)絡(luò)報(bào)錯(cuò)、系統(tǒng)超時(shí)、權(quán)限認(rèn)證等做攔截處理。

 
 
 
 
  1. axios.interceptors.response.use(function (response) {
  2.     // 把獲取的響應(yīng)主體信息返回
  3.     return response.data;
  4. }, function (reason) {
  5.     // 失?。壕W(wǎng)絡(luò)、狀態(tài)碼(Axios失敗)
  6.     let response = reason.response;
  7.     if (response) {
  8.         // 狀態(tài)碼不是2開(kāi)頭的
  9.         switch (response.status) {
  10.             //400 參數(shù)
  11.             //401/403 Token
  12.             //404 地址
  13.             //500/503 服務(wù)器
  14.         }
  15.     } else {
  16.         // 網(wǎng)絡(luò) / (超時(shí) / 中斷請(qǐng)求  -> code: "ECONNABORTED") ...
  17.         if (reason && reason.code === "ECONNABORTED") {}
  18.         if (!navigator.onLine) {}
  19.     }
  20.     return reason;
  21. });

一般項(xiàng)目,這樣就沒(méi)問(wèn)題了,一套公共的參數(shù)配置。剩下都是請(qǐng)求的時(shí)候單獨(dú)再配置即可。

Axios配置- 原理與源碼

1) HTTP 攔截器的設(shè)計(jì)與實(shí)現(xiàn)

對(duì)于大多數(shù) SPA 應(yīng)用程序來(lái)說(shuō), 通常會(huì)使用 token 進(jìn)行用戶的身份認(rèn)證。這就要求在認(rèn)證通過(guò)后,我們需要在每個(gè)請(qǐng)求上都攜帶認(rèn)證信息。如果在考慮對(duì)響應(yīng)進(jìn)行統(tǒng)一處理的話,我們的 request 函數(shù)將變得越來(lái)越龐大,也越來(lái)越難維護(hù)。那么對(duì)于這個(gè)問(wèn)題,Axios 為我們提供了解決方案 —— 攔截器。

Axios 是一個(gè)基于 Promise 的 HTTP 客戶端,而 HTTP 協(xié)議是基于請(qǐng)求和響應(yīng):

所以 Axios 提供了請(qǐng)求攔截器和響應(yīng)攔截器來(lái)分別處理請(qǐng)求和響應(yīng)。

1) 請(qǐng)求攔截器:該類攔截器的作用是在請(qǐng)求發(fā)送前統(tǒng)一執(zhí)行某些操作,比如在請(qǐng)求頭中添加 token 字段。

2) 響應(yīng)攔截器:該類攔截器的作用是在接收到服務(wù)器響應(yīng)后統(tǒng)一執(zhí)行某些操作,比如發(fā)現(xiàn)響應(yīng)狀態(tài)碼為 401 時(shí),自動(dòng)跳轉(zhuǎn)到登錄頁(yè)。

2) 二次封裝配置代碼:(參考)

 
 
 
 
  1. import axios from 'axios';
  2. import qs from 'qs';
  3. /*
  4.  * 根據(jù)環(huán)境變量區(qū)分接口的默認(rèn)地址 
  5. */
  6. switch (process.env.NODE_ENV) {
  7.     case "production":
  8.         axios.defaults.baseURL = "http://api.zhufengpeixun.cn";
  9.         break;
  10.     case "test":
  11.         axios.defaults.baseURL = "http://192.168.20.12:8080";
  12.         break;
  13.     default:
  14.         axios.defaults.baseURL = "http://127.0.0.1:3000";
  15. }
  16. /*
  17.  * 設(shè)置超時(shí)時(shí)間和跨域是否允許攜帶憑證 
  18. */
  19. axios.defaults.timeout = 10000;
  20. axios.defaults.withCredentials = true;
  21. /*
  22.  * 設(shè)置請(qǐng)求傳遞數(shù)據(jù)的格式(看服務(wù)器要求什么格式)
  23.  * x-www-form-urlencoded
  24. */
  25. axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';
  26. axios.defaults.transformRequest = data => qs.stringify(data);
  27. /*
  28.  * 設(shè)置請(qǐng)求攔截器 
  29.  * 客戶端發(fā)送請(qǐng)求 - > [請(qǐng)求攔截器] - > 服務(wù)器
  30. * TOKEN校驗(yàn)(JWT):接收服務(wù)器返回的token,存儲(chǔ)到vuex/本地存儲(chǔ)中,每一次向服務(wù)器發(fā)請(qǐng)求,我們應(yīng)該把token帶上
  31. */
  32. axios.interceptors.request.use(config => {
  33.     // 攜帶上token
  34.     let token = localStorage.getItem('token');
  35.     token && (config.headers.Authorization = token);
  36.     return config;
  37. }, error => {
  38.    return Promise.reject(error);
  39. });
  40. /*
  41.  * 響應(yīng)攔截器 
  42.  * 服務(wù)器返回信息  -> [攔截的統(tǒng)一處理] -> 客戶端JS獲取到信息
  43. */
  44. axios.defaults.validateStatus = status => {
  45.     // 自定義響應(yīng)成功的HTTP狀態(tài)碼
  46.     return /^(2|3)\d{2}$/.test(status);
  47. };
  48. axios.interceptors.response.use(response => {
  49.     return response.data;
  50. }, error => {
  51.     let {
  52.         response
  53.     } = error;
  54.     if (response) {
  55.         //=>服務(wù)器最起碼返回結(jié)果了
  56.         switch (response.status) {
  57.             case 401: //=>權(quán)限
  58.                 break;
  59.             case 403: //=>服務(wù)器拒絕執(zhí)行(token過(guò)期)
  60.                 break;
  61.             case 404: //=>找不到頁(yè)面 
  62.                 break;
  63.         }
  64.     } else {
  65.         //=>服務(wù)器連結(jié)果都沒(méi)有返回
  66.         if (!window.navigator.onLine) {
  67.             // 斷網(wǎng)處理:可以跳轉(zhuǎn)到斷網(wǎng)頁(yè)面
  68.             return;
  69.         }
  70.         return Promise.reject(error);
  71.     }
  72. });
  73. export default axios;

名稱欄目:項(xiàng)目實(shí)踐-Axios進(jìn)階封裝
文章出自:http://www.5511xx.com/article/coehchj.html