新手基于axios 的二次封装

《1》简单封装。

  • 在src文件夹下新建api文件夹,新建request.js
const _errno = 1
import axios from 'axios'

export function get(url) {
    return function (params) {
        return axios.get(url, {
            params
        }).then((res) => {
            const { errno, data } =res.data
            if(errno = _errno ){ //对数据进行判断 是否正确
                return data
            }                       
        }).catch(() => {

        })
    }
}
  • 在api文件夹新建index.js
import { get } from './request.js'

const getNews = get('/api/v1/news')

export {
    getNews
}
  • 使用
import { getNews } from 'api'

methods:{

    getData(){
        getNews().then((res) => {

        })
    }

《2》符合更多场景的封装
对request拦截器、response拦截器、统一的错误处理、统一做了超时处理、baseURL等统一进行了封装

新建api文件夹,新建request.js

import axios from 'axios'

import { MessageBox, Message } from 'element-ui'

import store from '@/store'

import { getToken } from '@/utils/auth'



// create an axios instance

const service = axios.create({

  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url

  // withCredentials: true, // send cookies when cross-domain requests

  timeout: 5000 // request timeout

})



// request interceptor

service.interceptors.request.use(

  config => {

    // do something before request is sent

    if (store.getters.token) {

      // let each request carry token

      // ['X-Token'] is a custom headers key

      // please modify it according to the actual situation

      config.headers['X-Token'] = getToken()

    }
    return config
  },

  error => {

    // do something with request error

    console.log(error) // for debug

    return Promise.reject(error)

  }

)

// response interceptor

service.interceptors.response.use(

  /**

   * If you want to get http information such as headers or status

   * Please return  response => response

  */

  /**

   * Determine the request status by custom code

   * Here is just an example

   * You can also judge the status by HTTP Status Code

   */

  response => {

    const res = response.data

    // if the custom code is not 20000, it is judged as an error.

    if (res.code !== 20000) {

      Message({

        message: res.message || 'Error',

        type: 'error',

        duration: 5 * 1000

      })

      // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;

      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {

        // to re-login

        MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {

          confirmButtonText: 'Re-Login',

          cancelButtonText: 'Cancel',

          type: 'warning'

        }).then(() => {

          store.dispatch('user/resetToken').then(() => {

            location.reload()

          })

        })

      }

      return Promise.reject(new Error(res.message || 'Error'))

    } else {

      return res

    }

  },

  error => {

    console.log('err' + error) // for debug

    Message({

      message: error.message,

      type: 'error',

      duration: 5 * 1000

    })

    return Promise.reject(error)

  }

)

export default service

新建index.js

import request from '@/utils/request'



export function fetchList(query) {

  return request({

    url: '/vue-element-admin/article/list', // 可进行地址的拼接

    method: 'get',

    params: query,

    baseURL: 'xxxx'  // 可进行覆盖url

  })

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你提供关于Axios二次封装的一些建议。在进行二次封装之前,你需要先确保已经安装了Axios。以下是一个基本的Axios二次封装示例: ```javascript import axios from 'axios'; // 创建一个Axios实例 const instance = axios.create({ baseURL: 'http://api.example.com', // 设置请求的基本URL timeout: 5000 // 设置请求超时时间 }); // 请求拦截器 instance.interceptors.request.use( config => { // 在请求发送之前做一些处理,比如添加token等 return config; }, error => { // 请求错误时的处理 return Promise.reject(error); } ); // 响应拦截器 instance.interceptors.response.use( response => { // 对响应数据进行处理 return response.data; }, error => { // 响应错误时的处理 return Promise.reject(error); } ); // 封装GET请求 export function get(url, params) { return instance.get(url, { params }); } // 封装POST请求 export function post(url, data) { return instance.post(url, data); } // 其他HTTP方法的封装类似,如put、delete等 export default instance; ``` 上述示例中,我们创建了一个基于Axios的实例,然后通过拦截器对请求和响应进行处理。你可以根据实际需求在拦截器中添加自定义逻辑,比如统一处理错误信息、添加请求头等。 封装的get和post函数可以直接调用,例如: ```javascript import request from './axios'; // 上述代码放在axios.js文件中 request.get('/api/users', { params: { page: 1 } }) .then(response => { console.log(response); }) .catch(error => { console.error(error); }); ``` 这样你就可以通过调用封装好的函数来发起请求,而无需每次都编写重复的代码。希望这对你有所帮助!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值