axios是一個基於promise的http庫,可運行在瀏覽器端和node.js中。他有不少優秀的特性,例如統一進行攔截請求和響應、取消請求、轉換json、客戶端防護XSRF等。因此在平常開發中能夠直接推薦咱們使用axios庫。若是還對axios不瞭解的,能夠移步axios文檔。迴歸正題,咱們所要的說的axios的封裝和api接口的統一管理,其實主要目的就是在幫助咱們簡化代碼和利於後期的更新維護。
node
import axios from 'axios'
import { Loading, Message } from 'element-ui' // 這裏我是使用elementUI的組件來給提示
import router from '@/router'
let loadingInstance = null // 加載全局的loading
const instance = axios.create({ //建立axios實例,在這裏能夠設置請求的默認配置
timeout: 200,
baseURL: process.env.NODE_ENV === 'production' ? '' : '/api', //根據本身配置的反向代理去設置不一樣環境的baeUrl
headers: {
token: sessionStorage.getItem('token') || ''
}
})
// 文檔中的統一設置post請求頭。下面會說到post請求的幾種'Content-Type'
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
let httpCode = { //這裏我簡單列出一些常見的http狀態碼信息,能夠本身去調整配置
400: '請求參數錯誤',
401: '權限不足, 請從新登陸',
403: '服務器拒絕本次訪問',
404: '請求資源未找到',
500: '內部服務器錯誤',
501: '服務器不支持該請求中使用的方法',
502: '網關錯誤',
504: '網關超時'
}
/** 添加請求攔截器 **/
instance.interceptors.request.use(config => {
loadingInstance = Loading.service({ // 發起請求時加載全局loading,請求失敗或有響應時會關閉
spinner: 'fa fa-spinner fa-spin fa-3x fa-fw',
text: '拼命加載中...'
})
// 在這裏:能夠根據業務需求能夠在發送請求以前作些什麼:例如我這個是導出文件的接口,由於返回的是二進制流,因此須要設置請求響應類型爲blob,就能夠在此處設置。
if (config.url.includes('pur/contract/export')) {
config.headers['responseType'] = 'blob'
}
// 我這裏是文件上傳,發送的是二進制流,因此須要設置請求頭的'Content-Type'
if (config.url.includes('pur/contract/upload')) {
config.headers['Content-Type'] = 'multipart/form-data'
}
return config
}, error=> {
// 對請求錯誤作些什麼
return Promise.reject(error)
})
/** 添加響應攔截器 **/
instance.interceptors.response.use(response => {
loadingInstance.close()
if (response.data.status === 'ok') { // 響應結果裏的status: ok是我與後臺的約定,你們能夠根據實際狀況去作對應的判斷
return Promise.resolve(response.data)
} else {
Message({
message: response.data.message,
type: 'error'
})
return Promise.reject(response.data.message)
}
}, error => {
loadingInstance.close()
if (error.response) {
// 根據請求失敗的http狀態碼去給用戶相應的提示
let tips = error.response.status in httpCode ? httpCode[error.response.status] : error.response.data.message
Message({
message: tips,
type: 'error'
})
if (error.response.status === 401) { // token或者登錄失效狀況下跳轉到登陸頁面,根據實際狀況,在這裏能夠根據不一樣的響應錯誤結果,作對應的事。這裏我以401判斷爲例
router.push({
path: `/login`
})
}
return Promise.reject(error)
} else {
Message({
message: '請求超時, 請刷新重試',
type: 'error'
})
return Promise.reject(new Error('請求超時, 請刷新重試'))
}
})
/* 統一封裝get請求 */
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)
})
})
}
/* 統一封裝post請求 */
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)
})
})
}
/* 或者寫成下面這樣: Promise.resolve() 和 Promise.reject()返回的是promise對象,兩者都是語法糖 */
export const post = (url, data, config = {}) => {
return instance({
method: 'post',
url,
data,
...config
}).then(response => {
return Promise.resolve(response)
}).catch(error => {
return Promise.reject(error)
})複製代碼
下面幾張圖是攔截器的回調函數的一些參數:ios
// 每一個模塊都應該有本身的接口文件去統一管理api
import { get, post } from '@/utils/request'
export const query = (params) => get('/pur/pay/pageInit', params)複製代碼
import { query } from '@/api/index'
export default {
name: 'App',
data () {
return {}
},
mounted () {
let params = { userName: 'admin', password: '123456'}
query(params).then(res => {
console.log(res, '這是響應的結果')
})
}
}複製代碼
能夠在請求的攔截器裏面config,去判斷,分別設置。也可使用已經封裝的get/post請求裏寫,在調用api時,傳第三個參數就是config的信息。配置的優先順序:配置會以一個優先順序進行合併, 這個順序是:在 lib/defaults.js 找到的庫的默認值,而後是實例的 defaults 屬性,最後是請求的 config 參數。後者將優先於前者。element-ui
通常狀況下axios只須要封裝post、get請求,這也是不少公司的代碼規範,至於爲何不使用其餘的請求方式,put(往服務器上傳文件),delect(刪除)直接對數據進行操做相對來講不安全 。json
axios雖然是一個插件,可是咱們不須要經過Vue.use(axios)來使用,下載完成後,只需在項目中引入便可,若是使用Vue.use()方法的話,則該方法默認會調用install方法,然鵝axios的做者彷佛並無寫install的方法。Vue引入的組件類型必須爲Function或者是Object。 若是是個對象,必須提供install方法,須要用Vue.use(), 若是是一個函數,會被直接看成install函數執行 axios
1.application/json : 參數會直接放在請求體中,以JSON格式的發送到後端。這也是axios請求的默認方式。這種類型使用最爲普遍。
最後:個人文章會持續更新完善中···, 若是文章對您有幫助,請點贊^_^,或者留言交流~~
後端