封装 Vue-axios

本文详细介绍了axios的使用,包括基本的请求方式、下载、直接导入、配置选项、并行请求、全局配置等。同时,讨论了如何通过创建axios实例来管理不同的baseURL,并展示了如何通过拦截器进行请求和响应的处理。文章最后提出了通过封装axios请求的四种方案,以应对可能的库更新需求。
摘要由CSDN通过智能技术生成

目录

请求方式

下载

直接导入

简单配置

并合请求

全局配置

请求配置

常见的配置选项

get 传 params

post 传 data

 axios 实例

解释

于是我们有思路:

第一种:

第二种:

第三种

第四种 终极方案

axios拦截器

请求拦截:

响应拦截


请求方式

 很多种请求方式,重点还是第一种吧

下载

npm install axios --save

下载完成

直接导入

import axios from 'axios'

简单配置

axios({
  url: 'http://'
}).then(res => {
  console.log(res);
})

并合请求

//并和请求
axios.all([
  axios({
    url: "http://123.207.32.32:8000/home/multidata"
  }),
  axios({
    url: 'http://123.207.32.32:8000/home/multidata',
    method: 'get',
    params: {
      type: 'pop',
      page: 3

    }
  })
  // 就是对象的解构
]).then(axios.spread((res1, res2) => {
  console.log(res1);
  console.log(res2);
}))

全局配置

axios.defaults.baseURL = "http://123.207.32.32:8000" 地址
axios.defaults.timeout = 5000  超时时间

请求配置

axios.all([
  axios({
    url: "/home/multidata"
  }),
  axios({
    url: '/home/multidata',
    method: 'get',
    params: {
      type: 'pop',
      page: 3

    }
  })
  // 就是对象的解构
]).then(axios.spread((res1, res2) => {
  console.log(res1);
  console.log(res2);
}))

常见的配置选项

get 传 params

post 传 data

 axios 实例

解释

有些时候url地址的ip可能会不同

那么就会出现多个baseURL和多个axios

这个时候就是创axios实例,不同的实例就可以配置不同的url 使用不同的 axios

// 创造axios实例instance1
const instance1 = axios.create({
  baseURL: 'http://123.207.32.32:8000',
  timeout: 5000
})
// 然后就可以使用这个实例axios(instance1)进行使用
instance1({
  url: "/home/multidata"
}).then(res => {
  console.log(res);
})

// 创造axios实例instance1
const instance2 = axios.create({
  baseURL: 'http://123.207.32.32:8000',
  timeout: 5000
})
// 然后就可以使用这个实例axios(instance2)进行使用
instance2({
  url: '/home/multidata',
  method: 'get',
  params: {
    type: 'pop',
    page: 3
  }
}).then(res => {
  console.log(res);
})

这样写在main.js就是太多太麻烦

然后我们直接写在组件里的create(){}中,每次重新创建一个组件就调用axios,但是每个组件都写,又是太过于麻烦。

这是个危险的行为,如果有一天axios下架了那么项目里的的每个地方都要改,工作量可想而知。

于是我们有思路:

那一天axios没用了我们就直接改我们自己封装的三方插件文件

第一种:

 创建一个request.js文件

import axios from 'axios'

export function request(config, success, failure) {
    //1。创建axiso的实例
    const instance = axios.create({
        baseURL: 'http://123.207.32.32:8000',
        timeout: 5000
    })

    //发送真正的网络请求
    instance(config)
        .then(res => {
            // console.log(res);
            success(res)
        })
        .catch(err => {
            // console.log(err);
            failure(err)
        })
}

在main.js文件里

// 5.封装request模块
import { request } from './network/request.js'

request({
  url: "/home/multidata"
}, res => {
  console.log(res);
}, err => {
  console.log(err);
})

这个封装还是有些问题,我们可以不用三个参数吗?直接用一个对象包三个变量就行,我们继续改进

第二种:

export function request(config) {
    //1。创建axiso的实例
    const instance = axios.create({
        baseURL: 'http://123.207.32.32:8000',
        timeout: 5000
    })
    //发送真正的网络请求
    instance(config.baseConfig)
        .then(res => {
            // console.log(res);
            config.success(res)
        })
        .catch(err => {
            // console.log(err);
            config.failure(err)
        })
}
request({
  baseConfig: {
    url: "/home/multidata"
  },
  success: res => {
    console.log(res);
  },
  failure: err => {
    console.log(err);
  }
})

第三种

因为是请求函数所以我们直接Promise

export function request(config) {
    return new Promise((resolve, reject) => {
        //1。创建axiso的实例
        const instance = axios.create({
            baseURL: 'http://123.207.32.32:8000',
            timeout: 5000
        })

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

}
request({
  url: "home/multidata",
}).then(res => {
  console.log(res);
}).catch(err => {
  console.log(err);
})

第四种 终极方案

因为 instance就是axios本身就是一个Promise所以直接return

export function request(config) {
    //1。创建axiso的实例
    const instance = axios.create({
        baseURL: 'http://123.207.32.32:8000',
        timeout: 5000
    })
    //发送真正的网络请求
    return instance(config)
}
request({
  url: "home/multidata",
}).then(res => {
  console.log(res);
}).catch(err => {
  console.log(err);
})

axios拦截器

请求拦截:

instance.interceptors.request.use(config => {
        console.log(config);
        // 1.config中的一些信息不符合服务器的要求
        // 2.每次请求时显示动画 请求成功隐藏
        // 3.当登陆时,如果没有携带token就拦截请求,提示去登录
        return config
    })

页面打印:

所以拦截了一定要return拦截内容

响应拦截

instance.interceptors.response.use(res => {
        console.log(res);
    }, err => {
        console.log(err);
    })

页面打印

 所以也一定要return

axios 结束!!!!!!!!!!!!!!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值