utilsフォルダを作成し、新しいservice.jsファイルを作成します。
import axios from 'axios'
import router from '@/router/routers'
import store from '../store'
import { Notification,MessageBox } from 'element-ui'
import { getToken } from '@/libs/utils' //カスタム・トークン取得メソッド
const baseUrl = {
dev: 'http://...xx',//開発環境
pro: 'http://...xx'//制作環境
}
// axiosインスタンスを作成する
const service = axios.create({
baseURL: process.env.NODE_ENV === 'production' ? baseUrl.pro : baseUrl.dev, // api ベース_url
timeout: 7000 // タイムアウトを要求する
})
// request
service.interceptors.request.use(
config => {
if (getToken()) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 各リクエストにカスタム・トークンを持たせる。
}
config.headers['Content-Type'] = 'application/json'
return config
},
error => {
Promise.reject(error)
}
)
// response
service.interceptors.response.use(
response => {
const code = response.status
if (code < 200 || code > 300) {
Notification.error({
title: response.data
})
return Promise.reject('error')
} else {
const { data, status } = response
return { data, status }
}
},
error => {
let code = 0
try {
code = error.response.status
} catch (e) {
if (error.toString().indexOf('Error: timeout') !== -1) {
Notification.error({
title: 'ネットワーク・リクエスト・タイムアウト',
duration: 5000
})
return Promise.reject(error)
}
}
if (code) {
if (code === 401) {
MessageBox.confirm(
'ログイン・ステータスが切れました、再ログインしてください」。,
'システムは',
{
confirmButtonText: '再ログインする,
cancelButtonText: ' ,
type: 'warning'
}
).then(() => {
store.dispatch('LogOut').then(() => {//Vuexのログアウトインターフェースを呼び出す
location.reload() // バグを避けるために、vue-routerオブジェクトを再定義する。
})
})
} else if (code === 403) {
router.push({ path: '/401' })
} else {
const errorMsg = error.response.data
if (errorMsg !== undefined) {
Notification.error({
title: errorMsg,
duration: 5000
})
}
}
} else {
Notification.error({
title: 'インターフェースのリクエストに失敗した,
duration: 5000
})
}
return Promise.reject(error)
}
)
export default service
srcディレクトリにapiフォルダを作成し、その中にindex.jsとdemo.jsを作成します。
demo.js
import request from '@/libs/service'//ラップされたaxiosを導入する
export const demo = {
getTableInfo(params) {
return request({
url: '/xxxx', //インターフェース・パス
method: 'get',
params
})
}
}
index.jsは、すべてのインターフェイス・ファイルを取り込むために作成されました。
import {demo} from './demo'
export default {
demo
}
main.jsでは.js
import api from './api'
Vue.prototype.$api = api//グローバル変数を作る
この時点で、インターフェース・ファイルを紹介する必要はありません。
async getData() {
try {
const data = {
pageNum:1,
pageSize:10
}
let res = await this.$api.demo.getTableInfo(data)
console.log(res)
} catch (e) {
console.log(e.response.data)
}
}