ios 請求失敗封裝_vue_axios請求封裝、異常攔截統一處理

1、前端網絡請求封裝、異常統一處理

vue中采用axios處理網絡請求,避免請求接口重復代碼,以及各種網絡情況造成的異常情況的判斷,采用axios請求封裝和異常攔截操作;

axios 請求封裝

// 引入axios文件包

import axios from 'axios'

// POST 方法封裝 (參數處理)

export const postRequest = (url, params) => {

return axios({

method: 'post',

url: url,

data: params,

transformRequest: [function (data) {

let ret = ''

for (let it in data) {

ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'

}

return ret

}],

headers: {

'Content-Type': 'application/x-www-form-urlencoded'

}

});

}

// POST 方法封裝 (文件上傳)

export const uploadFileRequest = (url, params) => {

return axios({

method: 'post',

url: url,

data: params,

headers: {

'Content-Type': 'multipart/form-data'

}

});

}

// GET 方法封裝

export const getRequest = (url) => {

return axios({

method: 'get',

url: url

});

}

// PUT 方法封裝

export const putRequest = (url, params) => {

return axios({

method: 'put',

url: url,

data: params,

transformRequest: [function (data) {

let ret = ''

for (let it in data) {

ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'

}

return ret

}],

headers: {

'Content-Type': 'application/x-www-form-urlencoded'

}

});

}

// DELETE 方法封裝

export const deleteRequest = (url) => {

return axios({

method: 'delete',

url: url

});

}

2)axios請求異常統一處理

// 引入依賴包

import axios from 'axios'

import {Message} from 'element-ui'

// REQUEST 請求異常攔截

axios.interceptors.request.use(config=> {

//========== 所有請求之前都要執行的操作 ==============

return config;

}, err=> {

//================== 錯誤處理 ====================

Message.error({message: '請求超時!'});

return Promise.resolve(err);

})

// RESPONSE 響應異常攔截

axios.interceptors.response.use(data=> {

//============== 所有請求完成后都要執行的操作 ==================

// 第一種方式

// 根據返回的code值來做不同的處理(和后端約定)

switch (data.code) {

case '0':

// exp: 修復iPhone 6+ 微信點擊返回出現頁面空白的問題

if (isIOS()) {

// 異步以保證數據已渲染到頁面上

setTimeout(() => {

// 通過滾動強制瀏覽器進行頁面重繪

document.body.scrollTop += 1

}, 0)

}

// 這一步保證數據返回,如果沒有return則會走接下來的代碼,不是未登錄就是報錯

return data

// 需要重新登錄

case 'SHIRO_E5001':

// 微信生產環境下授權登錄

if (isWeChat() && IS_PRODUCTION) {

axios.get(apis.common.wechat.authorizeUrl).then(({ result }) => {

location.replace(global.decodeURIComponent(result))

})

} else {

// 否則跳轉到h5登錄并帶上跳轉路由

const search = encodeSearchParams({

next: location.href,

})

location.replace(`/user/login`)

}

// 不顯示提示消息

data.description = ''

break

default:

}

// 若不是正確的返回code,且已經登錄,就拋出錯誤

const err = new Error(data.description)

err.data = data

err.response = response

// 第二種方式,僅對200和error狀態處理

if (data.status && data.status == 200 && data.data.status == 'error') {

Message.error({message: data.data.msg});

return;

}

return data;

}, err=> {

//============== 錯誤處理 ====================

if (err && err.response) {

switch (err.response.status) {

case 400: err.message = '請求錯誤(400)'; break;

case 401: err.message = '未授權,請重新登錄(401)'; break;

case 403: err.message = '拒絕訪問(403)'; break;

case 404: err.message = '請求出錯(404)'; break;

case 408: err.message = '請求超時(408)'; break;

case 500: err.message = '服務器錯誤(500)'; break;

case 501: err.message = '服務未實現(501)'; break;

case 502: err.message = '網絡錯誤(502)'; break;

case 503: err.message = '服務不可用(503)'; break;

case 504: err.message = '網絡超時(504)'; break;

case 505: err.message = 'HTTP版本不受支持(505)'; break;

default: err.message = `連接出錯(${err.response.status})!`;

}

} else {

err.message = '連接服務器失敗!'

}

Message.err( {message: err.message } )

return Promise.resolve(err);

})

請求出錯的時候我執行的是:Promise.resolve(err);,而不是Promise.reject(err);,這樣無論請求成功還是失敗,在成功的回調中都能收到通知

2、VUE 項目中使用該方法

1)在main.js中導入所有請求方法

// 導入所有請求方法

import {getRequest} from './utils/api'

import {postRequest} from './utils/api'

import {deleteRequest} from './utils/api'

import {putRequest} from './utils/api'

2)將請求方法添加至 Vue.prototype 上

// 向VUE的原型上添加請求方法

Vue.prototype.getRequest = getRequest;

Vue.prototype.postRequest = postRequest;

Vue.prototype.deleteRequest = deleteRequest;

Vue.prototype.putRequest = putRequest;

3)發送請求(請求方法的調用)

// 發送網絡請求

this.postRequest('/login', {userName,password}).then(resp=> {

...

}

});

4)案例

import Vue from 'vue'

import cypressIndex from '../components/rootVue/cypressIndex'

import ElementUI from 'element-ui';

import 'element-ui/lib/theme-chalk/index.css';

// axios請求的方法引入

import {getRequest} from '../components/utils/settings'

import {postRequest} from '../components/utils/settings'

Vue.use(ElementUI);

// 將axios方法添加到VUE原型上

Vue.prototype.getRequest = getRequest;

Vue.prototype.postRequest = postRequest;

Vue.config.productionTip = false

/* eslint-disable no-new */

new Vue({

el: '#cypressIndex',

render: h => h(cypressIndex)

})

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534291.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534291.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534291.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux基礎(使用ssh服務管理遠程主機1)

配置網絡參數 使用nmtui命令配置網絡參數,以及通過nmcli命令查看網絡信息并管理網絡會話服務。 執行nmtui命令運行網絡配置工具 進入主界面 選中編輯連接并按下回車鍵 選中要編輯的網卡名稱,然后按下Edit(編輯)按鈕 把網絡IPv4 …

聯想g510升級方案_聯想智慧中國行,聚焦第一古城,助力企業智能升級

12月29日,聯想智慧中國行“一起聯想 生態綻放”One Lenovo融合品鑒會邢臺站盛大啟幕,現場近70位河北合作伙伴到場參會,共同探討智能時代帶來的多重挑戰和迎戰機遇。“聯想智慧中國行”是聯想致力于推動中國行業智能化升級舉辦的系列活動&…

軟件工程(總體設計②設計原理)

設計原理 模塊化 模塊是由邊界元素限定的相鄰程序元素的序列,而且有一個總體標識符代表它。 按照模塊的定義,過程、函數、子程序和宏,都可作為模塊。 面向對象方法學中的對象是模塊,對象內的方法也是模塊。模塊是構成程序的基…

TensorFlow構建二維數據擬合模型(3)

占位符與數據喂入機制 placeholder是TensorFlow提供的占位符節點,由tf.placeholder()函數創建,其實質上也是一種變量。占位符沒有初始值,只會分配必要的內存,其值由會話中用戶調用的run()函數傳遞。 占位符聲明的方法如表 函數…

合作開發過程產生的專利_被起訴專利侵權怎么辦?專利律師給你出招!

隨著國內企業專利申請量的增加及專利保護意識的逐步提升,專利侵權訴訟作為常用的商業競爭手段和策略,其數量也隨之呈逐年遞增之勢。考慮到目前國內專利數量較多,且很多專利技術互有交叉,因此在進行產品研發時即使未借鑒他人產品&a…

idea怎么設置代碼提示不區分大小寫_IntelliJ IDEA 這樣設置動圖,棒極了!

轉自:IntelliJ-IDEA-Tutorial/Judas.n鏈接:http://suo.im/6sHdelIntelliJ IDEA 有很多人性化的設置我們必須單獨拿出來講解,也因為這些人性化的設置讓我們這些 IntelliJ IDEA 死忠粉更加死心塌地使用它和分享它。推薦設置IntelliJ IDEA 的代碼…

linux課堂筆記(1)

一、linux特點 1.源代碼開發: *.c *.h 可二次開發 2.安全:可檢測安全性 3.穩定:共享內存 內存沖突(Windows,內存沖突,藍屏死機) 4.網絡服務:server(WWW&#xf…

表字段順序有何影響_「品味保定」炸烹蝦段乾隆贊 百年保定柔雅香

【引文】上溯先賢堯帝,保定傳承已逾千載。燕趙之地、畿輔之疆、北控三關、南通九省、翅衛京師說的就是古城保定。千百年來,古城保定形成了獨具特色的飲食文化,精致氣派的直隸官府菜就是這種文化的結晶。品百年保定酒,嘗直隸官府菜…

linux課堂筆記(2)

linux安裝 1,虛擬機:VMware12 (1)注冊:商業軟件(集成序列號,注冊機(根據加密算法生成序列號),文本文件(記錄序列號)) &…

testufo測試刷新率測試_上手體驗微星電競顯示器PAG301CR:200Hz高刷新率只是它的小亮點...

電子競技行業高速發展,逐漸成為體育產業版圖中重要的一塊,產業鏈也在不斷完善,人們對于電子競技的認識也是越來越深刻,同時越來越多的人加入了電子競技行列中,但是電競游戲除了水平外,設備同樣也尤其重要,特…

linux課堂筆記(3)

1,linux廠商版本信息 內核信息:主版本.修正號.發行號.on 硬件平臺. 主機名 登錄 身份認證 localhost login:root password:隱藏口令 提示上一次登錄時間與地點 用戶名主機名 當前目錄 指令提示符 rootlocalhost ]# 注&…

graphpad做折線圖坐標軸數字_pandas做數據可視化具體操作,快來看看吧

來自公眾號:大鄧和他的Python常見的數據可視化庫有:matplotlib 是最常見的2維庫,可以算作可視化的必備技能庫,由于matplotlib是比較底層的庫,api很多,代碼學起來不太容易。seaborn 是建構于matplotlib基礎上&#xff0…

linux課堂筆記(4)

常用指令:mv 1,隱藏文件 (1)windows通過設置屬性隱藏文件 attrib h s 文件 attrib h s d:\net.txt attrib h s d:\net.txt (2)linux系統文件以點開始命名隱藏文件 mv /路徑/源文件 /路徑/目標…

實現輸入提示 layui_ASP.NET Core SignalR :學習消息通訊,實現一個消息通知

什么是 SignalR目前我用業余時間正在做一個博客系統,其中有個功能就是評論通知,就是假如A用戶評論B用戶的時候,如果B用戶首頁處于打開狀態,那么就會提示B用戶有未讀消息。暫時用SignalR來實現這個功能。我也是看了兩天的資料才明白…

linux課堂筆記(5)

vi編輯器 1,vi版本:vi —— vim ps:查看進程 進程 ID 時間 終端 進程名稱 ps -t 終端(查看指定終端進程) vi 回車(提示vi版本信息) 2,vi特點 (1)…

兩個字和三個字一樣寬_武漢國慶出行 記好三個字

武漢國慶出行國慶黃金周帶你一起見證奇跡樂在武漢國慶去哪兒玩?記住:三 個 字歡樂谷記住【歡樂谷】三個字,你就不會迷路!不算白來。歡樂谷有啥好?免費!國慶期間,歡樂谷面向全國人民免費開放&…

linux課堂筆記(6)

設置文件訪問權限: 1,通過字母設置:參數 字母 (1)用戶類型: u 擁有者 g 同組用戶 o 其他用戶 a所有用戶 (2)權限:r 讀 w 寫 x執行 注:目錄權…

什么標簽用于在表單中構建復選框_UI/UX筆記之如何設計好表單

原文鏈接:UI/UX筆記之如何設計好表單 | 須臾所學免費設計資源網?presentationvip.com無論是注冊流程,多視圖步驟程序還是單調的數據輸入界面,表單都是數字產品設計中最重要的組成部分之一。本文重點介紹表單設計的常見事項。請記住&#xff…

linux課堂筆記(7)

編譯器&#xff1a;gcc 格式&#xff1a;gcc [參數] <源程序> gcc test.c 注&#xff1a;默認生成可執行程序a.out&#xff08;windows默認test.exe&#xff09; ./a.out gcc -o 可執行文件 源程序 gcc -o test.exe test.c&#xff08;windows&#xff09; g…

mqtt 發送消息過多_阿里云MQTT服務端注解式消息處理分發與同步調用實踐小結

一、前言前段時間公司預研了設備app端與服務端的交互方案&#xff0c;出于多方面考量最終選用了阿里云的微服務隊列MQTT方案&#xff0c;基于此方案&#xff0c;本人主要實踐有&#xff1a;1. 封裝了RocketMQ實現MQTT訂閱與發布的實現細節&#xff1b;2. 實現了注解式分發處理&…