创建对应的axios实例,意思是一个axios实例对应一个接口地址,如果这个接口地址下有多条路径,就可以直接调用这个实例去请求,相同的信息抽象到这个实例里!

案例:

/*
 * axios实例
**/

const crmeb = axios.create({
    baseurl: 'https://store.crmeb.net/api/pc',
    timeout: 5000
})

crmeb({
    url: '/get_products',
    params: {
        page: 1,
        limit: 20,
        cid: 57,
        sid: 0,
        priceorder: '', 
        news: 0,
    }
}).then(res => {
    console.log(res)
})

crmeb({
    url: '/get_company_info',
}).then(res => {
    console.log(res)
})


// coderwhy

const coderwhy = axios.create({
    baseurl: 'http://123.207.32.32:8000',
    timeout: 5000
})

coderwhy({
    url: '/home/multidata'
}).then(res => {
    console.log(res)
})

coderwhy({
    url: '/category'
}).then(res => {
    console.log(res)
})

主要是用来抽取公共逻辑到一个配置文件里,对这些公共逻辑做一个封装,即使某一天这个axios框架不维护了,或者出现了重大bug也不再修复的时候,我们可以只修改配置文件即可达到全局修改的目的,如果把每次请求逻辑都写到对应的组件中,那修改起来简直就是一个噩梦!

抽取网络请求公共配置

一般是在项目的src目录下创建一个network文件夹,新建一个request.js文件,以后所有发送网络请求只面向这一个文件!

封装方法一(回调法):

// network/request.js

import axios from 'axios'

// 这里没有使用default导出,是为了方便以后扩展,可以导出多个方法
// 知识点:default导出只能导出一个
export function request(config, success, failure){
    // 1. 创建axios实例
    const instance = axios.create({
        baseurl: 'https://store.crmeb.net/api/pc',
        timeout: 5000
    })

    // 这里发送请求,但是还牵扯到调用结果,不会吧数据在这里展示
    // 因此,还需要想办法将数据导出去,异常也得导出去
    instance(config)
        // 将数据回调出去的办法是,在request方法中传入一个获取请求成功和
        // 失败的回调参数success和failure,这两个参数都必须是函数
        .then(res => {
            // 请求成功的回调函数success()
            success(res)
        })
        .catch(res => {
            // 请求失败的回调函数success()
            failure(res)
        })
}

如何使用

例如我们现在要用在项目的main.js文件中,如下所示:

/*
 * 调用封装一个request模块
**/


// 引入request方法
import {request} from "./network/request"  

request({
    url: '/get_products',
    params: {
        page: 1,
        limit: 20,
        cid: 57,
        sid: 0,
        priceorder: '', 
        news: 0,
    }
}, res => {
    // res箭头函数对应request方法中的success参数
    // 返回请求到的数据
    console.log(res)
}, err => {
    // err箭头函数对应request方法中的failure参数
    // 返回错误信息
    console.log(err)
})

封装方法二(回调法):

这个封装方法与第一个思路是一致的,只是将请求数据封装进了一个basconfig对象,对外暴露了两个回调函数封装到config当中!

// network/request_b.js

import axios from 'axios'

export function request_b(config){
    // 1. 创建axios实例
    const instance = axios.create({
        baseurl: 'https://store.crmeb.net/api/pc',
        timeout: 5000
    })
	// 发送请求,axios的相关请求参数在baseconfig中定义
    instance(config.baseconfig)
        .then(res => {
            // 请求成功的回调函数success()
            config.success(res)
        })
        .catch(res => {
            // 请求失败的回调函数success()
            config.failure(res)
        })
}

使用

/*
 * 封装一个request_b模块
**/

import { request_b } from "./network/request_b"

request_b({
    baseconfig: {
        url: '/get_company_info',
    },
    success: function (res) {
        console.log(res)
    },
    failure: function (err) {
        console.log(err)
    }
})

终极封装方案

采用new一个promise对象的方法去封装!

// network/request_promise.js

import axios from 'axios'

export function request_promise(config) {
    return new promise((resolve, reject) => {
        // 1. 创建axios实例
        const instance = axios.create({
            baseurl: 'https://store.crmeb.net/api/pc',
            timeout: 5000
        })

        // 2. 发送真正的网络请求
        instance(config)
            .then(res => {
                resolve(res)
            })
            .catch(err => {
                reject(err)
            })

    })
}

但是,其实axios的实例就是一个promise对象,那么我们就没有必要自己再去new一个promise,直接将其return返回即可!

export function request_promise(config) {
        // 1. 创建axios实例
        const instance = axios.create({
            baseurl: 'https://store.crmeb.net/api/pc',
            timeout: 5000
        })

        // 2. 发送真正的网络请求
        return instance(config)

}

使用

/*
 * 封装一个request_promise模块
**/
import { request_promise } from "./network/request_promise"

request_promise({
    url: '/get_company_info',
}).then(res => {
    console.log(res)
}).catch(err => {
    console.log(err)
})