四十八、封装Axios网络请求

注意:

  • 1、当后端接收参数的方式为 @RequestParam 时,那么前端在封装请求时,参数的 keyparams,参见 getRequestWithParams()
  • 2、当后端接收参数的方式为 @RequestBody 时,那么前端在封装请求时,参数的 keydata ,参见 postRequest()

1.封装

api.js

import axios from 'axios'
import router from '../router/index'
import {Message} from 'element-ui'
import {UN_LOGIN} from './utils'
// 拦截 axios 请求
axios.interceptors.request.use(config => {
    return config
}, err => {
    Message.error({
        message: '请求超时'
    })
    // return Promise.resolve(err)
})
// 拦截 axios 响应
axios.interceptors.response.use(data => {
    // 请求成功,但是状态码为500
    if(data.status && data.status == 200 && data.data.status == 500) {
        //对于 “未登录” 情况,要单独考虑,将其路由到登录页面
        if (data.data.msg == UN_LOGIN) {
            router.push('/')
        } else {
            Message.error({
            message: data.data.msg
        })
        }
        return
    }
    // 请求成功,输出消息
    if(data.data.msg) {
        Message.success({
            message: data.data.msg
        })
    }
    return data
}, err => {
    var msg
    // err.response.status:请求在服务器发生异常时,前端接收到的响应(此时请求已
    // 成功,但是服务器报错了)
    if(err.response) {
        switch (err.response.status) {
            case 504:
                msg = '服务器没上线!'
                break
            case 500:
                msg = '服务器没上线!'
                break
            case 404:
                msg = '服务器没上线!'
                break
            case 403:
                msg = '权限不足,请联系管理员!'
                break
            case 401:
                msg = err.response.data.msg
                break
            default:
                if(err.response.data.msg) {
                    msg = err.response.data.msg
                } else {
                    msg = '未知错误!'
                }
                break
        }
        Message.error({
            message: msg
        })
    }
    return Promise.resolve(err)
})
/**
 * 问题:为什么这里的根路径是 '' ?
 *     因为请求的路径 ${url} 都会写成“/user/**”等形式,而我们对“/”请求在
 * vue.config.js中已经转发成真实请求路径,所以只要是“/**”都可以正常访问。
 * ${url} 中都带有 “/”,所以这里 ${base} 为 '' 就好
 */
let base = ''
// POST请求,参数采用json形式进行传递
export const postRequest = (url, params) => {
    return axios({
        method: 'post',
        url: `${base}${url}`,
        data: params,
        // `transformRequest`允许在请求数据发送到服务器之前对其进行更改
        transformRequest: [
            data => {
                return JSON.stringify(data)
            }
        ],
        headers: {
            'Content-Type': 'application/json'
        }
    })
}
// POST请求,参数采用表单形式进行传递(后台的Spring Security 只能接收Form表单形式传递的username,password)
export const postRequestByForm = (url, params) => {
    return axios({
        method: 'post',
        url: `${base}${url}`,
        data: params,
        // `transformRequest`允许在请求数据发送到服务器之前对其进行更改
        transformRequest: [
            data => {
                let result = ''
                for(let param in data) {
                    result += encodeURIComponent(param) + "=" + encodeURIComponent(data[param]) + "&"
                }
                return result
            }
        ],
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        }
    })
}
// 封装上传文件请求
export const uploadFileRequest = (url, params) => {
    return axios ({
        method: 'post',
        url: `${base}${url}`,
        data: params,
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        }
    })
}
export const putRequest = (url, params) => {
    return axios({
        method: 'put',
        url: `${base}${url}`,
        data: params,
        transformRequest: [
            data => {
                return JSON.stringify(data)
            }
        ],
        headers: {
            'Content-Type': 'application/json'
        }
    })
}
export const deleteRequest = url => {
    return axios({
        method: 'delete',
        url: `${base}${url}`
    })
}

export const getRequest = url => {
    return axios({
        method: 'get',
        url: `${base}${url}`
    })
}

export const getRequestWithParams = (url, params) => {
    return axios({
        method: 'get',
        url: `${base}${url}`,
        // get请求的参数key是params,与其他请求是data不太一样!!!
        params: params,
        // `transformRequest`允许在请求数据发送到服务器之前对其进行更改
        transformRequest: [
            params => {
                let result = ''
                for(let param in params) {
                    result += encodeURIComponent(param) + "=" + encodeURIComponent(data[param]) + "&"
                }
                return result
            }
        ],
        headers: {
            'Content-Type': 'application/json'
        }
    })
}

2.全局可用:

main.js

.......
// 引入封装的请求
import {getRequest, getRequestWithParams, postRequest, postRequestByForm, deleteRequest, putRequest, uploadFileRequest} from './utils/api'
//注入到vue对象,在项目可直接使用
Vue.prototype.getRequest = getRequest
Vue.prototype.getRequestWithParams = getRequestWithParams
Vue.prototype.postRequest = postRequest
Vue.prototype.postRequestByForm = postRequestByForm
Vue.prototype.deleteRequest = deleteRequest
Vue.prototype.putRequest = putRequest
Vue.prototype.uploadFileRequest = uploadFileRequest
.....
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值