vue-axios-loading-api-配置

简介: axios多少年了依然这么流行,而且也没什么大的更新简单到极致,真是小而美尤大的 官方库vue-resource都放弃维护了,推荐用 axiosaxios

1.前言


axios多少年了依然这么流行,而且也没什么大的更新

简单到极致,真是小而美

尤大的 官方库vue-resource都放弃维护了,推荐用 axios

axios

特点:

  1. 基于promise的http库
    2.可运行在浏览器端和node.js中
    3.拦截请求和响应
    4.取消请求
  2. 转换json
  3. 客户端防御XSRF等


2. vue里面 基础使用axios


1.安装 npm install axios

  1. 3x脚手架 也可以  vue add axios


3.基础使用


新建 axios文件

main.js引入 axios文件

vue add axios已经帮我们做了上述操作

组件使用

注意 这里不能 this.$http 版本不同


const api = "/api/v1/code";
           this.axios.post(api,{test:"测试"}).then((res)=>{
               console.log("验证码--",res)
               this.codeUrl = res.data.code
           })

vue.config.js配置代理

代理可以配置多个

比如你图片服务器或者 文件服务器不同也可以配置


devServer: {
    // port:8080,
    // host:"yzs.com",
    open: true,
    proxy:{
      "/api":{
        target:"https://xx.xx.org",
        ws:false,
        changeOrigin:true,
        pathRewrite:{
          "^/api":""
        }
      }
    }
  }



4. baseUrl配置


全局配置-方式1

这里主要就是 网络请求的基础配置

请求超时经常设置


let config = {
  baseURL: "https://www.yzs.xx.",
  timeout: 60 * 1000, // Timeout
  withCredentials: true, // Check cross-site Access-Control
};

这个可以走单独的配置文件 ,不同的环境不同的地址

baseURL: process.env.baseURL || process.env.apiUrl ||""

全局配置-方式2


/ /axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || '';
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';



5. 某些情况下,有些个别请求也需要单独配置


局部配置


this.axios.defaults.baseURL = "http://www.yzs.com"
            const api = "/api/v1/code";
           this.axios.post(api,{test:"测试"}).then((res)=>{
               console.log("验证码--",res)
               this.codeUrl = res.data.code
           })

以上配置只对 本次请求有效


6. 不同环境不同baseURL



if (process.env.NODE_ENV == 'development') {    
    axios.defaults.baseURL = 'https://www.baidu.com';} 
else if (process.env.NODE_ENV == 'debug') {    
    axios.defaults.baseURL = 'https://www.ceshi.com';
} 
else if (process.env.NODE_ENV == 'production') {    
    axios.defaults.baseURL = 'https://www.production.com';
}



7. 基于element-ui的 loading配置


1.基于 vue add axios后的 axios文件

2.就是在request请求的时候加上loding动画

3.响应response的时候关闭

4.也可以在响应成功里面 对响应数据做个初步处理

比如数据结构剥离一层

比如根据后端的 状态码 统一做处理


import { Loading } from 'element-ui';
const _axios = axios.create(config);
var loading = null
_axios.interceptors.request.use(
  function(config) {
    loading= Loading.service({
      lock: true,
      text: 'Loading',
      spinner: 'el-icon-loading',
      background: 'rgba(0, 0, 0, 0.7)'
    });
    // Do something before request is sent
    return config;
  },
  function(error) {
    // Do something with request error
    return Promise.reject(error);
  }
);
// Add a response interceptor
_axios.interceptors.response.use(
  function(response) {
    loading.close()
    // Do something with response data
    return response;
  },
  function(error) {
    // Do something with response error
    return Promise.reject(error);
  }
);



8. api拆分

大部分道友可能习惯直接在组件内发请求


this.$http.post(this.$hosts.yzsm.YZS_HOST + '/companyRight/getAllCompanyByMap', params)

从各大项目来看比如各大框架的 admin模板,api也都是拆分的

但是从项目架构角度出发,这样写非常不方便查阅和管理

所以单独拆分出来文件,这个想法其实和 store的拆分一样

步骤

  1. src/api 目录 或者assets/api目录 这个在哪倒是无伤大雅
  2. 新建文件,一般按功能分,不按界面
    比如用户信息相关   user.js
    比如登录注册相关  login.js
    比如城市相关     city.js
    比如店铺相关    shop.js
    比如权限相关  right.js
  3. 也不必非得太细
注释必不可少

getpost 都一样 参数根据需要传递


//获取权限列表
export const getAllRights = (params)=>{
        return axios.get("/api/companyRight/getAllCompanyByMap", {params})
}
// 更新权限
export const updateRight = ()=>{
    return axios.get("/api/companyRight/updateCompanyRight")
}
// 更新管理员权限
export const updateAdmin = ()=>{
    return axios.get("/api/companyRight/updateCompanyAdmin")
}



9. api使用

1. 引入

因为接口一般都比较多选用 别名的方式引入


import * as api from "@/api/rights.js";

如果比较少也可以 直接引入


import {updateAdmin ,updateRight ,getAllRights }  from "@/api/rights.js";

根据自己的情况选用一种就行

2. 使用

别名引入 直接  别名.属性 调用

直接引入就直接用, 但是注意不要和 组件内方法重名

所有还是建议使用别名的方式


methods: {
    getRightsBtn() {
      var params = {
      };
        api.getAllRights (params).then((res) => {
            if(res.data.bean  !== "2000"){
                return  this.$message.error(res.data.returnMessage)
            }
           this.listData = res.data.bean.list
            console.log("Res:",res)
        })
        .catch((err) => {
          console.log("失败", err);
        });
    },
  },



10. 请求拦截

why为啥要拦截呢

有些请求是需要用户登录之后才能访问的,或者post请求的时候,我们需要序列化我们提交的数据。这时候,我们可以在请求被发送之前进行一个拦截,从而进行我们想要的操作。

  1. 需要导入 vuex,因为这里面管理着我们需要的状态,比如,用户是否登录,用户会员级别


_axios.interceptors.request.use(
  config => {        
//在发送请求之前做些什么
        // 每次发送请求之前判断vuex中是否存在token        
        // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
        // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断 
        const token = store.state.token;        
        token && (config.headers.Authorization = token);        
        return config;   
  },
  function(error) {
//  对请求错误做些什么
    // Do something with request error
    return Promise.reject(error);
  }
);

这里用到的是 vuex add axios 添加后自动生成的


11. token 简要

1.一般是在登录完成之后,将用户的token通过localStorage或者cookie存在本地

2.然后用户每次在进入页面的时候(即在main.js中),会首先从本地存储中读取token

3.如果token存在说明用户已经登陆过,则更新vuex中的token状态。

4.然后,在每次请求接口的时候,都会在请求的header中携带token,

5.后台人员就可以根据你携带的token来判断你的登录是否过期,如果没有携带,则说明没有登录过。

6.每个请求都携带token,那么要是一个页面不需要用户登录就可以访问的怎么办呢?前端的请求可以携带token,但是后台可以选择不接收啊!


12.  token 取消


const CancelToken = axios.CancelToken;
let cancel;
axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // executor 函数接收一个 cancel 函数作为参数
    cancel = c;
  })
});
// cancel the request
cancel();


13. 扩展 -响应拦截-配置

就是服务器返回给我们的数据,我们在拿到之前可以对他进行一些处理

如果后台返回的状态码是200,则正常返回数据,

否则的根据错误的状态码类型进行一些我们需要的错误,其实这里主要就是进行了错误的统一处理和没登录或登录过期后调整登录页的一个操作。


_axios.interceptors.response.use(
  response => {   
// 对响应数据做点什么
        // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据     
        // 否则的话抛出错误
    res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res), 
  },
 // 服务器状态码不是2开头的的情况
    // 这里可以跟你们的后台开发人员协商好统一的错误状态码    
    // 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等
    // 下面列举几个常见的操作,其他需求可自行扩展
    error => {            
// 对响应错误做点什么
        if (error.response.status) {            
            switch (error.response.status) {                
                // 401: 未登录
                // 未登录则跳转登录页面,并携带当前页面的路径
                // 在登录成功后返回当前页面,这一步需要在登录页操作。                
                case 401:                    
                    router.replace({                        
                        path: '/login',                        
                        query: { 
                            redirect: router.currentRoute.fullPath 
                        }
                    });
                    break;
                // 403 token过期
                // 登录过期对用户进行提示
                // 清除本地token和清空vuex中token对象
                // 跳转登录页面                
                case 403:
                     Toast({
                        message: '登录过期,请重新登录',
                        duration: 1000,
                        forbidClick: true
                    });
                    // 清除token
                    localStorage.removeItem('token');
                    store.commit('loginSuccess', null);
                    // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面 
                    setTimeout(() => {                        
                        router.replace({                            
                            path: '/login',                            
                            query: { 
                                redirect: router.currentRoute.fullPath 
                            }                        
                        });                    
                    }, 1000);                    
                    break; 
                // 404请求不存在
                case 404:
                    Toast({
                        message: '网络请求不存在',
                        duration: 1500,
                        forbidClick: true
                    });
                    break;
                // 其他错误,直接抛出错误提示
                default:
                    Toast({
                        message: error.response.data.message,
                        duration: 1500,
                        forbidClick: true
                    });
            }
            return Promise.reject(error.response);
        }
    }    
});

window.navigator.onLine 可以判断是否在线




相关文章
|
19天前
|
程序员 API 开发者
实战阿里qwen2.5-coder 32B,如何配置Cline的Ollama API接口。
阿里Qwen2.5大模型开源免费,适合编程应用。在Ollama平台下载时,推荐选择带有“cline”字样的Qwen2.5-Coder版本,仅需额外下载适配文件,无需重复下载模型文件。Ollama环境永久免费,配置简单,效果出色,适合开发者使用。
907 77
|
3月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
66 4
|
2月前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
3月前
|
JavaScript 数据可视化
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
这篇文章详细介绍了Vue CLI 3版本创建项目时的Runtime-Compiler和Runtime-only两种模式的区别、Vue程序的运行过程、render函数的使用、eslint的关闭方法,以及Vue CLI 2和3版本配置文件的不同和脚手架3版本创建项目的配置文件配置方法。
234 3
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
|
2月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
670 4
|
3月前
|
资源调度 JavaScript 前端开发
路由管理:Vue Router的使用和配置技巧
【10月更文挑战第21天】路由管理:Vue Router的使用和配置技巧
65 3
|
3月前
|
存储 前端开发 中间件
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
720 0
|
4月前
|
JavaScript
vue项目中使用vue-router进行路由配置及嵌套多级路由
该文章详细说明了如何在Vue项目中配置和使用vue-router进行单页面应用的路由管理,包括设置嵌套路由和实现多级路由导航的示例。
|
4月前
|
JavaScript
Vue3基础(20)___Vue3配置错误路由重定向写法
本文介绍了Vue 3中配置错误路由重定向的正确写法,包括使用参数和自定义正则表达式来定义通配符路由。
72 0
Vue3基础(20)___Vue3配置错误路由重定向写法
|
3月前
|
JavaScript
vue尚品汇商城项目-day01【2.vue-cli脚手架初始化项目的其他配置】
vue尚品汇商城项目-day01【2.vue-cli脚手架初始化项目的其他配置】
38 0

热门文章

最新文章