vue axios encapsulates httpjs interface common configuration intercepts operations

  • 2021-08-06 20:20:18
  • OfStack

Make 1 record and configure the common request https in the vue project.

(1) Position, create src/utils/http. js in src


import axios from 'axios' //  Quote axios
import { MessageBox, Message } from 'element-ui'
import Qs from 'qs' // Introducing data formatting 
import router from '@/router'
 
// axios  Configure 
axios.defaults.timeout = 50000 // Setting interface response time 
// axios.defaults.baseURL = 'https://easy-mock.com/mock/' //  This is the call data interface , Common interface url+ Call interface name 
let httpUrl = window.location.host
if (httpUrl.indexOf('.com') !== -1) {
 console.log(' Production environment ', httpUrl)
} else if (httpUrl.indexOf('.net') !== -1) {
 console.log(' Test environment ', httpUrl)
 axios.defaults.baseURL = 'http://www.test.com' //  This is the call data interface , Common interface url+ Call interface name 
} else if (httpUrl.indexOf('localhost:8088') !== -1) {
 console.log(' Specify the development environment ', httpUrl)
 axios.defaults.baseURL = 'http://localhost:8088/'
} else {
 console.log(' Development environment ', httpUrl)
 axios.defaults.baseURL = 'http://192.168.6.138:8080/' //  This is the call data interface , Common interface url+ Call interface name 
}
 
// http request  Interceptor, through this, we can put Cookie Pass to the background 
axios.interceptors.request.use(
 config => {
  if (config.method == "post") {
  // console.log(' Request path ', config.url)
  if (config.url === '/b/login/checkLogin') {
   config.headers = {
    'Content-Type': 'application/x-www-form-urlencoded' //  Setting cross-domain headers 
   }
   config.data = Qs.stringify(config.data)
  } else if (config.url === '/b/carModel/createCarModelVersion') {
   //  Set file upload here and configure individual request headers 
   config.headers = {
    'Content-Type': 'multipart/form-data'
   }
  } else {
   let userInfo = localStorage.getItem('userInfo')
   if (userInfo === null) {
    return null
   }
   let bToken = localStorage.getItem('btoken')
   if (bToken === null) {
   } else {
    config.data.vwToken = bToken
   }
   config.headers = {
    'Content-Type': 'application/x-www-form-urlencoded' //  Setting cross-domain headers 
   }
   config.data = Qs.stringify(config.data)
  }
}else{
console.log("get Request ")
}
  return config
 },
 err => {
  return Promise.reject(err)
 }
)
 
// http response  Interceptor 
axios.interceptors.response.use(
 response => {
  // console.log(' Request interception return parameter ', response)
  if (response.status === 200) {
   //  Success 
   let returnCode = response.data.code
   if (returnCode > 10000 && returnCode < 20000) {
    // console.log(' Success ', response)
    Message.success(response.data.msg)
   } else if (returnCode >= 20000 && returnCode < 30000) {
    //  Pop-up window only, no operation 
    // console.log(' Failure 1', response)
    Message.error(response.data.msg)
   } else if (returnCode >= 30000 && returnCode < 40000) {
    //  Only pop-up window, click to jump to the login page 
    localStorage.removeItem('userInfo')
 
    MessageBox.confirm(response.data.msg, ' Confirm logout ', {
     confirmButtonText: ' Re-login ',
     cancelButtonText: ' Cancel ',
     type: 'warning'
    }).then(() => {
     // console.log(' You should log out here   Re-instantiation ')
     router.push({ path: '/login' })
    })
   }
  }
  return response
 },
 error => {
  // console.log('error', error.toString())
  if (
   error.toString().trim() ===
   "TypeError: Cannot read property 'cancelToken' of null"
  ) {
   localStorage.removeItem('userInfo')
   MessageBox.confirm(
    ' Session credentials are invalid. You can cancel staying on this page or log in again ',
    ' Confirm logout ',
    {
     confirmButtonText: ' Re-login ',
     cancelButtonText: ' Cancel ',
     type: 'warning'
    }
   ).then(() => {
    // console.log(' You should log out here   Re-instantiation ')
    router.push({ path: '/login' })
   })
  }
 
  // console.log(error.toString().trim())
  if (error.toString().trim() === 'Error: Network Error') {
   MessageBox.alert(' Network request exception, please try again later ', ' There's been a mistake ', {
    confirmButtonText: ' Determine ',
    callback: action => {}
   })
  }
  return Promise.reject(error.response.data)
 }
)
 
export default axios
 
/**
 * fetch  Request method 
 * @param url
 * @param params
 * @returns {Promise}
 */
export function get(url, params = {}) {
 return new Promise((resolve, reject) => {
  axios
   .get(url, {
    params: params
   })
   .then(response => {
    resolve(response.data)
   })
   .catch(err => {
    reject(err)
   })
 })
}
 
/**
 * post  Request method 
 * @param url
 * @param data
 * @returns {Promise}
 */
export function post(url, data = {}) {
 return new Promise((resolve, reject) => {
  axios.post(url, data).then(
   response => {
    // console.log(response.data.code)
    resolve(response.data)
   },
   err => {
    reject(err)
   }
  )
 })
}
 
/**
 * patch  Method encapsulation 
 * @param url
 * @param data
 * @returns {Promise}
 */
export function patch(url, data = {}) {
 return new Promise((resolve, reject) => {
  axios.patch(url, data).then(
   response => {
    resolve(response.data)
   },
   err => {
    reject(err)
   }
  )
 })
}
 
/**
 * put  Method encapsulation 
 * @param url
 * @param data
 * @returns {Promise}
 */
export function put(url, data = {}) {
 return new Promise((resolve, reject) => {
  axios.put(url, data).then(
   response => {
    resolve(response.data)
   },
   err => {
    reject(err)
   }
  )
 })
}

(2) Introducing call in main. js to define global


import axios from 'axios'
import { post, get, patch, put } from './utils/http'
 
//  Will axios Add to prototype chain 
Vue.prototype.$axios = axios
 
//  Define global variables 
Vue.prototype.$post = post
Vue.prototype.$get = get
Vue.prototype.$patch = patch
Vue.prototype.$put = put

(3) Use it directly on the. vue page that needs to be used


//this.logForm  For transmission of reference 
 
this.logForm = { id: this.selectId, knowledgeVersionId: this.baseValue }
this.$post(' Yours url', this.logForm).then(req => {
    this.logList = req.data
    this.logList.allCount = req.allCount
    this.logList.nowPage = req.nowPage
    this.logList.pageSize = req.pageSize
    this.loading = false
   }).catch(err => {
    console.log(err)
   })
 
 this.$post('/b/checkConfig/updateRelateKnowledge', { id: this.selectId, knowledgeVersionId: this.baseValue }).then(req => {
    console.log(req)
    if (req.code === 10000) {
     // this.options = req.data
     this.getConfigList()
    }
   }).catch(err => {
    console.log(err)
   })

Supplementary knowledge: Vue project about axios twice encapsulated service

1. Install axios: npm i axios--save

2. Create a new file service. js in the src directory

3. Write the following code in the service. js file


import axios from 'axios'

//  Create 1 Object with a common configuration axios Instances , The configuration content in the example depends on the actual development requirements 
export const service = axios.create({
 baseURL: 'http://***.***.*.**:8080/', //  Test environment 
 timeout: 1000 * 10, //  The number of milliseconds the request timed out , If the request costs more than timeout Time of , The request will be interrupted 
 withCredentials: true, //  Indicates whether credentials are required for cross-domain requests , Default fasle
 headers: { 'Cache-Control': 'no-cache' } //  Cache is not allowed, request needs to be retrieved again 
})

//  Add a request interceptor 
service.interceptors.request.use(config => {
 //  What to do before sending the request 
 return config
}, error => {
 //  Do something about request errors 
 return Promise.reject(error)
})

//  Add a response interceptor 
axios.interceptors.response.use(response => {
 //  Do something about the response data 
 return response
}, error => {
 //  Do something about response errors 
 return Promise.reject(error)
})

The above is the preliminary encapsulation of axios, and the specific functions are configured in service. js file according to actual requirements

4. Use service for global use (it can also be used locally, which will be explained later)

Step 1: Mount in main. js

import { service } from './service'

Vue.prototype.service = service

Step 2: Use the


//  Note: You must use the async  And  await  Otherwise request status 1 Straight Promise {<pending>}, Unable to get the requested data 
 async created () {
  let data = await this.service.get('menu/user/tree')
  console.log(data) // You can get the requested data at this time 
 }

5. Use service locally, and introduce it first and then use it in the component


<script>
import { service } from '../service'
export default {
 name: 'HelloWorld',
 data () {
  return {
   msg: 'sds'
  }
 },
 async created () {
  let data = await service.get('menu/user/tree')
  console.log(data)
 }
}
</script>

Related articles: