当前位置:   article > 正文

基础Axios封装与使用(基本流程步骤)_axios封装和使用

axios封装和使用

目录

        axios是基于promise封装的请求库,它可作用于浏览器和NODE,相较于普通的ajax请求,它自身新加了拦截器、为请求添加附加条件等新特性。

二、axios的使用及封装(基于vue-cli

一、安装axios

npm install axios

二、搭建一个目录结构(考虑区分开发和生产环境)

        说明:.env.dev 和 .env.prod 是在由开发环境切换到生产环境打包或启动时使用。因为在封装axios时,你进需要通过node中的环境变量process.env即可取到当前加载的配置文件,通过配置来判断不同的阶段。下面解释一下两个文件如何放?以及如何配置使用?【.env.dev  .end.prod】

  1. //在使用vue-cli构建的项目中,在根目录下【与vue.config.js同级】新建 .env.dev 和 .env.prod 文件
  2. //该文件格式必须使用 = 的键值对
  3. //NODE_ENV为固定键 值为当前处于开发环境
  4. NODE_ENV = "development"
  5. //BASE_URL为固定键 值为当前的基础请求地址【该值也可在axios封装时写】
  6. BASE_URL = "http://123.com.cn"
  7. //以上两个键为配置文件中可直接使用的键,但是要在配置文件中使用其他键,则必须添加前缀 VUE_APP_
  8. //【VUE中】所有解析出来的环境变量都可以在 public/index.html 中以 【HTML 插值】中的方式使用。
  9. /*
  10. <%= value %> 直接插值
  11. <%- value%> 可以转换成html标签的
  12. <link href="<%= BASE_URL %>favicon.ico">
  13. */

该配置可在切换生产和开发环境时通过指令一键切换。通过执行不同的 npm run dev等启动服务【package.json】

  1. "scripts": {
  2. "serve": "vue-cli-service serve",
  3. "dev": "vue-cli-service serve --mode dev",
  4. "prod": "vue-cli-service serve --mode prod",
  5. "build": "vue-cli-service build",
  6. "lint": "vue-cli-service lint"
  7. }

三、axios的基础封装

        提前考虑:1.要区分是开发环境或生产环境  2.超时问题  3.代理问题   4.基础地址问题    5.拦截器需要做什么   6.权限添加验证cookie 或 tooken。【http.js】

  1. import axios from "axios";
  2. //不同环境下的地址
  3. let baseURL = "";
  4. //node中的环境变量process.env,也就是我们新增开发、生产的配置文件
  5. if(process.env.NODE_ENV === "development"){
  6. baseURL = "http://localhost:8080" //这里可在vue.config.js做一个代理【代理代码见下】
  7. }else{
  8. baseURL = "123.com.cn"
  9. }
  10. //创建axios实例
  11. const request = axios.create({
  12. timeout: 5000,
  13. baseURL:baseURL
  14. });
  15. //所有请求设置了授权头信息【请求头中设置cookie信息,一直携带,判权】
  16. axios.defaults.headers.common['Authorization'] = `${cookie}`;
  17. //这里是设置发送json格式参数
  18. axios.defaults.headers.post['Content-Type'] = 'application/json';
  19. //请求拦截器
  20. request.interceptors.request.use(
  21. //发送之前想要做些什么
  22. config => {
  23. // token是否过期,是否重新登陆等等
  24. // 此处可修改一些基本数据
  25. // config[baseURL,[data,[headers,[method,[timeout,[url] 等
  26. // 基础地址,请求参数,头部, 请求方式, 超时, 请求地址 等
  27. // config.headers.Cookie = "110110110110110110";
  28. return config;
  29. },
  30. //方法返回一个带有拒绝原因的 Promise 对象。
  31. error => Promise.reject(error)
  32. );
  33. /**************移除拦截器****************/
  34. // 动态移除
  35. // const me = axios.interceptors.request.use(function () {/*...*/});
  36. // axios.interceptors.request.eject(me);
  37. /***************************************/
  38. //响应拦截器(对请求结束后进行一些操作,,例如:统一收集报错)
  39. request.interceptors.response.use(
  40. //请求成功
  41. res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),
  42. //请求失败
  43. error => {
  44. //可根据不同的状态去区分不同的错误,达到不同效果
  45. if(error.response.status){
  46. error.response.status === 404 ? alert("请求不存在!!") : alert("其他");
  47. }
  48. return Promise.reject(error);
  49. }
  50. );
  51. export default request

在vue.config.js配置文件中对我们的请求做一个代理。

  1. const { defineConfig } = require('@vue/cli-service')
  2. module.exports = defineConfig({
  3. transpileDependencies: true,
  4. lintOnSave:false,//关闭语法检查
  5. //方式一
  6. /*
  7. devServer:{//代理
  8. proxy:'http://localhost:3000'
  9. }
  10. */
  11. //方式二
  12. devServer:{
  13. proxy:{
  14. "/":{
  15. target:"https:localhost:3000",//代理到的服务器地址
  16. ws:false,//是否对websocket启动代理
  17. changeOrigin:true,//用于控制请求头中的值
  18. }
  19. }
  20. }
  21. })

四、另种封装 — 简单封装

        在项目中,如果请求数量少,请求简单,限制条件较少,则可使用一种简单的方法进行封装调用。

  1. import axios from "axios";
  2. //封装对应的get请求
  3. const get = (url, params) => {
  4. return new Promise((resolve, reject) => {
  5. axios.get(url, {params})
  6. .then(res => resolve(res))
  7. .catch(err => reject(err));
  8. });
  9. }
  10. //封装对应的post请求
  11. const post = (url, param) => {
  12. return new Promise((resolve, reject) => {
  13. axios.post(url, param)
  14. .then(res => resolve(res))
  15. .catch(err => reject(err));
  16. });
  17. }

五、axios封装后 业务请求 的封装使用

        建立一个专门存放业务请求的文件夹api【这里根据业务需求:有的会存在两个文件夹,接口文件和接口业务执行文件】,api文件中放各个业务js的文件,并且设置统一的导出文件index.js即可

业务1.js

  1. //封装的请求
  2. import axios from '../http'
  3. //参数序列化方法 <最后的结果也就是&a=1&b=2>
  4. import qs from 'qs'
  5. export default {
  6. //登录
  7. loginIn(params){
  8. return axios.post('/loginIN',qs.stringify(params));
  9. },
  10. //退出
  11. loginOut(params){
  12. return axios.post('/loginIN',params);
  13. },
  14. //注册
  15. loginUp(params){
  16. return axios.get('/loginIN',{params});
  17. }
  18. }

业务2.js

  1. import axios from '../http'
  2. import qs from 'qs'
  3. export default {
  4. //更新列表
  5. refreshList(params){
  6. return axios.post('/refreshList',qs.stringify(params));
  7. },
  8. //更新提示
  9. refreshTips(params){
  10. return axios.post('/loginIN',params);
  11. }
  12. }

业务3.js

  1. import axios from '../http'
  2. export default {
  3. poetryPost(params){
  4. return axios.post('/all.json',params);
  5. },
  6. poetryGet(){
  7. return axios.get('/all.json');
  8. }
  9. }

index.js

  1. import loginAPI from './业务1'
  2. import refreshData from './业务2'
  3. import initPoetry from './业务3'
  4. export {
  5. loginAPI,
  6. refreshData,
  7. initPoetry
  8. }

六、在页面代码中使用封装的业务请求app.vue

        原先将axios放在vue的实例身上,这样就可以直接用this;但是v3的this没有了,所以现在也不推荐这样做了。应该避免每次都使用axios.create创建实例,实例过多既会占据内存也会影响效率。

  1. <template>
  2. <div>
  3. <h1>诗句:{{content}}</h1>
  4. <h2>诗句:{{content2}}</h2>
  5. </div>
  6. </template>
  7. <script>
  8. //使用不区分V2、V3
  9. import { initPoetry } from './axiosRequest/api/index'
  10. export default {
  11. data(){
  12. return {
  13. content:"",
  14. content2:""
  15. }
  16. },
  17. mounted(){
  18. initPoetry.poetryPost({a:1}).then(
  19. res => this.content = res.data.content,
  20. err => console.log(err)
  21. ).catch(
  22. err => console.log(err)
  23. );
  24. initPoetry.poetryGet().then(
  25. res => this.content2 = res.data.content,
  26. err => console.log(err)
  27. ).catch(
  28. err => console.log(err)
  29. );
  30. }
  31. }
  32. </script>

三、可扩展

        至此一个基于vue-cli搭建项目的基础axios封装就完成了,在此基础上可将封装进行扩展,使得更丰富与健壮。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/305981
推荐阅读
相关标签
  

闽ICP备14008679号