這篇“react axios請(qǐng)求攔截如何實(shí)現(xiàn)”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“react axios請(qǐng)求攔截如何實(shí)現(xiàn)”文章吧。
創(chuàng)新互聯(lián)擁有10年成都網(wǎng)站建設(shè)工作經(jīng)驗(yàn),為各大企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作服務(wù),對(duì)于網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、重慶APP開發(fā)、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、程序開發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、申請(qǐng)域名等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷經(jīng)驗(yàn),集策劃、開發(fā)、設(shè)計(jì)、營(yíng)銷、管理等網(wǎng)站化運(yùn)作于一體,具備承接各種規(guī)模類型的網(wǎng)站建設(shè)項(xiàng)目的能力。
react axios請(qǐng)求攔截的實(shí)現(xiàn)方法:1、下載axios;2、在src目錄下創(chuàng)建一個(gè)utils文件夾用于存放公用js;3、在utils目錄下創(chuàng)建http.js文件;4、創(chuàng)建axios實(shí)例;5、添加請(qǐng)求攔截器;6、判斷cookie有沒有存儲(chǔ)token,并處理請(qǐng)求頭即可。
react 封裝axios請(qǐng)求攔截、響應(yīng)攔截、封裝post、get請(qǐng)求
默認(rèn)你已經(jīng)創(chuàng)建好了一個(gè)react項(xiàng)目
首先我們需要下載axios,我存儲(chǔ)用戶信息是用react-cookie,你們可以選擇使用本地存儲(chǔ)
npm i axios --save
npm i react-cookie --save
然后在src目錄下創(chuàng)建一個(gè)utils文件夾用于存放公用js,
繼續(xù)utils目錄下創(chuàng)建http.js文件。
另一個(gè)標(biāo)記的index.js則是下面會(huì)說到的入口文件
打開http.js文件,我們得開始干正事了
如果你已經(jīng)下載好了axios和cookie則需要引入,其中axios是必須的cookie不是
import axios from "axios";
import cookie from 'react-cookies'
//這是使用代理的路徑,如果你想了解的話可以看我之前的文章或者~~問我
let baseUrl = '/api'
// 創(chuàng)建axios實(shí)例,在這里可以設(shè)置請(qǐng)求的默認(rèn)配置
const instance = axios.create({
timeout: 10000, // 設(shè)置超時(shí)時(shí)間10s,如果10秒沒有返回結(jié)果則中斷請(qǐng)求,認(rèn)為連接超時(shí)
baseURL: baseUrl // 根據(jù)自己配置的代理去設(shè)置不同環(huán)境的baseUrl
})
// 文檔中的統(tǒng)一設(shè)置post請(qǐng)求頭
instance.defaults.headers.post['Content-Type'] = 'application/json';
// 如果你是上傳文件的話需要設(shè)置為
// instance.defaults.headers.post['Content-Type'] = 'multipart/form-data';
開始請(qǐng)求攔截部分
請(qǐng)求攔截就是在你的請(qǐng)求還沒有發(fā)送之前,你可以對(duì)你的請(qǐng)求做一些修改
/** 添加請(qǐng)求攔截器 **/
instance.interceptors.request.use(config => {
var token = cookie.load('token')//獲取你登錄時(shí)存儲(chǔ)的token
// 判斷cookie有沒有存儲(chǔ)token,有的話加入到請(qǐng)求頭里
if (token) {
config.headers['token'] = token//在請(qǐng)求頭中加入token
}
// 如果還需要在請(qǐng)求頭內(nèi)添加其他內(nèi)容可以自己添加 "[]" 內(nèi)為自定義的字段名 "=" 后的內(nèi)容為字段名對(duì)應(yīng)的內(nèi)容
// config.headers['自定義鍵'] = '自定義內(nèi)容'
// 如果此時(shí)覺得某些參數(shù)不合理,你可以刪除它,刪除后將不會(huì)發(fā)送給服務(wù)器
// delete config.data.userName
// userName是你傳遞的參數(shù)名,或許你可以試著在控制臺(tái)輸出config看看它包含了什么
// 對(duì)應(yīng)可以刪除也可以在此添加一些參數(shù)
// config.data.userName = '天道酬勤'
return config
}, error => {
// 對(duì)請(qǐng)求錯(cuò)誤做些什么
return Promise.reject(error)
})
開始響應(yīng)攔截部分
響應(yīng)攔截就是在你的接口返回?cái)?shù)據(jù)后,攔截器會(huì)先獲取,你可以判斷是否正常或數(shù)據(jù)完好再把數(shù)據(jù)返回到發(fā)起請(qǐng)求的地方
/** 添加響應(yīng)攔截器 **/
instance.interceptors.response.use(response => {
if (response.statusText === 'OK') {
return Promise.resolve(response.data)
} else {
return Promise.reject(response.data.msg)
}
}, error => {
// 請(qǐng)求報(bào)錯(cuò)的回調(diào)可以和后端協(xié)調(diào)返回什么狀態(tài)碼,在此根據(jù)對(duì)應(yīng)狀態(tài)碼進(jìn)行對(duì)應(yīng)處理
if (error.response) {
// 如401我就讓用戶返回登錄頁(yè)
if (error.response.status === 401) {
this.props.history.push('/login');
}
// 比如返回報(bào)錯(cuò)你的頁(yè)面可能會(huì)崩潰,你需要在它崩潰之前做一些操作的話,可以在這里
return Promise.reject(error)
} else {
return Promise.reject('請(qǐng)求超時(shí), 請(qǐng)刷新重試')
}
})
你添加了請(qǐng)求攔截器,則須使用自定義的請(qǐng)求,否則攔截器將沒有意義
一般我都是封裝兩個(gè)請(qǐng)求,一個(gè)post、一個(gè)get就足夠了
/* 統(tǒng)一封裝get請(qǐng)求 */
export const get = (url, params, config = {}) => {
return new Promise((resolve, reject) => {
instance({
method: 'get',
url,
params,
...config
}).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
}
/* 統(tǒng)一封裝post請(qǐng)求 */
export const post = (url, data, config = {}) => {
return new Promise((resolve, reject) => {
instance({
method: 'post',
url,
data,
...config
}).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
}
這里已經(jīng)將封裝好的請(qǐng)求方式拋出了,需要在入口文件里引用,設(shè)置為全局變量,你也可以在需要的地方按需引入,但我不太建議
入口文件是src目錄下的index.js文件,如果不清楚的話上面圖片有做標(biāo)記
import React, { Component } from 'react';
import { get, post } from './utils/http';
Component.prototype.get = get;
Component.prototype.post = post;
使用的話
let data = {
userName: 'admin',
password: '123456'
}
// post請(qǐng)求實(shí)例
this.post("url",data).then(res=>{
// 這里是成功回調(diào)
console.log(res)
}).catch(err=>{
// 這里是錯(cuò)誤回調(diào)
console.log(err)
})
// get請(qǐng)求實(shí)例
this.get("url",data).then(res=>{
// 這里是成功回調(diào)
console.log(res)
}).catch(err=>{
// 這里是錯(cuò)誤回調(diào)
console.log(err)
})
完整代碼
import axios from "axios";
import cookie from 'react-cookies'
let baseUrl = '/api'
// 創(chuàng)建axios實(shí)例,在這里可以設(shè)置請(qǐng)求的默認(rèn)配置
const instance = axios.create({
timeout: 20000, // 設(shè)置超時(shí)時(shí)間10s
// baseURL: baseUrl // 根據(jù)自己配置的反向代理去設(shè)置不同環(huán)境的baseUrl
})
// 文檔中的統(tǒng)一設(shè)置post請(qǐng)求頭。下面會(huì)說到post請(qǐng)求的幾種'Content-Type'
instance.defaults.headers.post['Content-Type'] = 'application/json'
/** 添加請(qǐng)求攔截器 **/
instance.interceptors.request.use(config => {
var token = cookie.load('token')//獲取本地存儲(chǔ)的token
// 判斷cookie有沒有存儲(chǔ)token,有的話加入到請(qǐng)求頭里
if (token) {
config.headers['token'] = token//在請(qǐng)求頭中加入token
}
// 如果還需要在請(qǐng)求頭內(nèi)添加其他內(nèi)容可以自己添加 [] 內(nèi)為自定義的字段名 = 后的內(nèi)容為字段名對(duì)應(yīng)的內(nèi)容
// config.headers['api'] = api
return config
}, error => {
// 對(duì)請(qǐng)求錯(cuò)誤做些什么
return Promise.reject(error)
})
/** 添加響應(yīng)攔截器 **/
instance.interceptors.response.use(response => {
if (response.statusText === 'OK') {
return Promise.resolve(response.data)
} else {
return Promise.reject(response.data.msg)
}
}, error => {
// 請(qǐng)求報(bào)錯(cuò)的回調(diào)可以和后端協(xié)調(diào)返回什么狀態(tài)碼,在此根據(jù)對(duì)應(yīng)狀態(tài)碼進(jìn)行對(duì)應(yīng)處理
if (error.response) {
// 如401我就讓用戶返回登錄頁(yè)
if (error.response.status === 401) {
this.props.history.push('/login');
}
return Promise.reject(error)
} else {
return Promise.reject('請(qǐng)求超時(shí), 請(qǐng)刷新重試')
}
})
/* 統(tǒng)一封裝get請(qǐng)求 */
export const get = (url, params, config = {}) => {
return new Promise((resolve, reject) => {
instance({
method: 'get',
url,
params,
...config
}).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
}
/* 統(tǒng)一封裝post請(qǐng)求 */
export const post = (url, data, config = {}) => {
return new Promise((resolve, reject) => {
instance({
method: 'post',
url,
data,
...config
}).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
}
以上就是關(guān)于“react axios請(qǐng)求攔截如何實(shí)現(xiàn)”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前名稱:reactaxios請(qǐng)求攔截如何實(shí)現(xiàn)
文章源于:http://muchs.cn/article28/iioejp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)頁(yè)設(shè)計(jì)公司、域名注冊(cè)、網(wǎng)站內(nèi)鏈、App設(shè)計(jì)、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)