Vue封装Axios & api管理

Posted 未飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue封装Axios & api管理相关的知识,希望对你有一定的参考价值。

前言:

你连Axios是什么干什么用的都不知道,那么你去封装它有意义吗?  

  既然要封装Axios,先了解Axios(没有时间的直接向下划!)

  axios介绍(W3C):

        axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,本质上也是对原生XHR(XmlHttpRequest)的封装,只不过它是Promise的实现版本,符合最新的ES规范,有以下特点: 

  • 从浏览器中创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

axios优点:

        1.支持node端和浏览器端

                同样的API,node和浏览器全支持,平台切换无压力

        2.支持 Promise

                使用Promise管理异步,告别传统callback方式

        3.丰富的配置项

                支持拦截器等高级配置

        4.社区支持

                axios相关的npm包数量一直在增长

axios缺点:

        1、对搜索引擎不友好

        2、要实现Ajax下的前后退功能成本较大

        3、跨域问题限制

为什么对Axios进行二次封装?

        如果项目比较小你直接使用也没什么,但是现在我们项目越写越大,越写越多 如果这时候还要直接使用的话 那如果后期 后台改了一个接口或者改了一个参数什么的呢?你是不是还要在很多的页面里去找到当前页再进行修改,这个过程太过繁琐,不利于项目的维护和迭代.

        这时统一的区间管理接口,需要修改某一个接口的时候直接在 api 里修改对应的请求是不是很方便,也就是说你需要修改参数或者路径直接去 api 里修改就好了,就不需要再去一大堆页面里找了。

上面对Axios做一个简单的了解


进入正题封装Axios:

在根目录下新建一个文件夹,在当前文件夹下新建文件 request.js 文件

在 request.js 文件中主要做了三件事:

1、对axios的基本设置

2、请求拦截器

3、相应拦截器

import axios from 'axios' //首先引入axios
import { Toast } from 'vant'

// create an axios instance  创建axios实例
const service = axios.create({
    baseURL: "基地址", // url = base api url + request url
    withCredentials: true, // 是否携带 cookies 
    timeout: 5000 // 请求超时时间
})

// request请求拦截器 request interceptor
service.interceptors.request.use(
        config => {
            //vant 轻提示
            Toast.loading({
               message: '加载中...',
               forbidClick: true,
               forbidClick: true
            })
            return Promise.resolve(config) 
        },
        error => {
            // do something with request error
            console.log(error) // for debug
            return Promise.reject(error)
        }
    )

    // respone响应拦截器
service.interceptors.response.use(
    response => {
        Toast.clear()
        const res = response.data
        if (res.status && res.status !== 200) {
            // 登录超时,重新登录
            if (res.status === 401) {
                store.dispatch('FedLogOut').then(() => {
                    location.reload()
                })
            }
            return Promise.reject(res || 'error')
        } else {
            return Promise.resolve(res)
        }
    },
    error => {
        Toast.clear()
        console.log('err' + error) // for debug
        return Promise.reject(error)
    }
)
// 最后抛出axios实例 
export default service

封装请求地址

同文件夹新建 api.js

在 api.js 中写一些地址

const api = {
  Login: '/user/login',
  UserInfo: '/user/userinfo',
  UserName: '/user/name'
}

export default api

封装请求方法

封装好后   在同文件夹下 新建文件user.js

在user.js中将封装好的Axios导入 ,数据请求就在user.js中进行

//请求地址
import api from './api'
// axios
import request from './request'

// 登录
export function login(data) {
  return request({
    url: api.Login,
    method: 'post',
    data
  })
}

// 用户信息 post 方法
export function getUserInfo(data) {
  return request({
    url: api.UserInfo,
    method: 'post',
    data,
    hideloading: true
  })
}

// 用户名称 get 方法
export function getUserName(params) {
  return request({
    url: api.UserName,
    method: 'get',
    params,
    hideloading: true
  })
}

使用请求方法

因为使用的是  export 导出的请求方法,所以我们使用时 只需要将方法名导入即可

//可以导入多方法
import { nav,appIndex } from "@/http/api"
export default {
  data(){
    return{
      banner_list:[],
      nav_list:[]
    }
  },
  created(){
    this.getbanner();
  },
  methods:{
    async getbanner(){
      const { data:res } = await nav();
      this.banner_list= res
    },
    async getappIndex(){
      const { data:res } = await appIndex();
      this.nav_list = res
      console.log(res);
     }
  }
}

持续更新中  点关注   不迷路!!!

以上是关于Vue封装Axios & api管理的主要内容,如果未能解决你的问题,请参考以下文章

vue中Axios的封装和API接口的管理

vue 封装propmise 第一种 -----axios封装---api资源管理

vue axios封装以及API统一管理

Vue中封装axios

axios 封装,API接口统一管理,支持动态API!

axios拦截,api统一管理