vue基于axios封装网络层

封装axios

在封装之前首先我们要知道为什么要二次封装axios?

  • api统一管理,不管接口有多少,所有的接口都可以非常清晰,容易维护
  • 降低代码耦合度,避免组件内出现过多的重复代码。
  • 请求拦截和响应拦截,如果不封装的话在组件内就会在每一个有请求的地方都要写重复的代码

首先封装网络模块的核心方法

import axios from "axios"
// import qs from	'qs'
import { Message, Loading } from 'element-ui'


/* 
* 调用axios.create方法,配置一些属性,返回一个新的axios
*/

const instance = axios.create({
    baseURL: "http://localhost:8080/",
    timeout: 2000
})

/* 
* 请求拦截
*/

let loading;

instance.interceptors.request.use(
    config => {
        // loading效果
        loading = Loading.service({
            fullscreen: true,
            lock: true,
            text: "正在加载,请稍等……",
            spinner: "el-icon-loading"
        })
        return config
    },
    error => {
        loading.close();
        // 对错误请求的处理
        // 弹出错误请求消息
        Message({
            showClose: true,
            message: error.message,
            type: "error"
        })
        return Promise.reject(error)
    }
)

/* 
* response拦截器 请求之后的操作
*/
instance.interceptors.response.use(
    config => {
            loading.close();
        return config
    },
    error => {
        return Promise.reject(error)
    }
)

export default instance

在这里我并没有把请求方式封装进去,但是也是可以封装的

// 如果有这一步的封装的话,上面的导出就需要注释掉了
/* export default {
    get(url, params) {
        return new Promise(
            (resolve, reject) => {
                instance.get(url, params)
                    .then(response => {
                        resolve(response)
                    }).catch(error => {
                        reject(error)
                    })
            }
        )
    },
    post(url, params) {
        return new Promise(
            (resolve, reject) => {
                instance.post(url, params)
                    .then(response => {
                        resolve(response)
                    }).catch(error => {
                        reject(error)
                    })
            }
        )
    }
} */

然后进一步封装并导出所有的请求方式,在使用的地方按需引入

export const GET = "get"
export const POST = "post"
export const POT = "pot"
export const DELETE = "delete"

封装api接口,然后导出,按需引入

const path = {
    data:"data.json",
    topSearch:"topSearch.json",
    history:"history.json"
}
export default path

然后再定义一个管理所有请求的文件,导入封装的api接口以及请求方式,还有二次封装的axios请求

import fetch from "./modulesManager"
import path from "./api"
import {GET} from "./requestMethods"

export function getHomeList(params){
    return fetch({
        url:path.data,
        method:GET,
        params:params
    })
}
export function getHotSearchList(params){
    return fetch({
        url:path.topSearch,
        method:GET,
        params:params
    })
}
export function getSearchList(params){
    return fetch({
        url:path.history,
        method:GET,
        params:params
    })
}

如果把请求方式也封装在网络模块的话就需要这样使用

/* export function getHomeList(url,params){
    return fetch.get(url,params)
}
export function getHotSearchList(url,params){
    return fetch.get(url,params)
}
export function getSearchList(url,params){
    return fetch.get(url,params)
}
 */

这样一个简单的网络层就封装好了,这种东西每个公司都会有不同的写法,不过大体思路都是差不多的,就是可能使用的人越来越多然后模块封装的功能越来越多,但是最基本的功能还是一样的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3.0 中,我们可以使用 axios 库来发送网络请求。为了更好地管理和封装网络请求,我们可以将 axios 的一些常用配置和方法进行封装,以便在多个组件中进行调用。 下面是一个简单的 axios 封装示例: ```javascript import axios from 'axios' const instance = axios.create({ baseURL: 'http://localhost:3000', timeout: 5000 }) instance.interceptors.request.use(config => { // 在请求发送之前做些什么 return config }, error => { // 对请求错误做些什么 return Promise.reject(error) }) instance.interceptors.response.use(response => { // 对响应数据做些什么 return response.data }, error => { // 对响应错误做些什么 return Promise.reject(error) }) export default { get(url, params) { return instance.get(url, { params }) }, post(url, data) { return instance.post(url, data) } } ``` 在上面的代码中,我们首先使用 `axios.create` 方法创建了一个 axios 实例,并对实例的一些常用配置进行了设置,如 `baseURL` 和 `timeout`。然后,我们使用 `interceptors` 对请求和响应进行拦截处理,以便在请求发送和响应返回时做一些额外的操作,如在请求发送之前添加请求头信息,或者在响应返回时对响应数据进行解析。 最后,我们将封装好的请求方法暴露出去,并使用 `instance.get` 和 `instance.post` 方法来发送 GET 和 POST 请求。 使用时,我们只需要在组件中引入封装好的请求方法,并调用即可: ```javascript import request from '@/api/request' export default { methods: { fetchData() { request.get('/api/data', { page: 1, size: 10 }).then(res => { console.log(res) }) } } } ``` 在上面的代码中,我们先引入了封装好的请求方法,并在方法中调用了 `request.get` 方法来发送 GET 请求,并传入了请求的 URL 和参数。请求成功后,我们将返回的数据打印到控制台上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值