当前位置: 首页 > news >正文

uniapp封装请求拦截器,封装请求拦截和响应拦截的方法

首先我们先看一下uni官方给开发者提供的uni.request用来网络请求的api

1

2

3

4

5

6

7

8

9

uni.request({

  url: '',

  method: 'GET',

  data: {},

  header: {},

  success: res => {},

  fail: () => {},

  complete: () => {}

});

可以看到我们每次请求数据的时候都需要按照这个格式来请求,这样会使代码冗余并且难以维护,所以就需要将uni.request进行二次封装

uni.request 三种请求方式

uni.request 请求方式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

// 默认方式

uni.request({

  url: 'https://www.example.com/request',

  success: (res) => {

    console.log(res.data);

  }

});

// Promise

uni.request({

    url: 'https://www.example.com/request'

  })

  .then(data => {

    //data为一个数组,数组第一项为错误信息,第二项为返回数据        

    var [error, res] = data;

    console.log(res.data);

  }) // Awaitasync 

function request() {

  var [error, res] = await uni.request({

    url: 'https://www.example.com/request'

  });

  console.log(res.data);

}

封装响应拦截器

1. 新建一个request.js文件

1

2

3

4

5

6

7

8

9

10

11

export default {

  config: {

    baseURL: '',

    // 响应拦截器

    beforeRequest() {},

    // 请求拦截器

    handleResponse() {}

  },

  // request 请求

  request() {}

}

2. 在响应拦截器中封装公共方法

我们先在request中调用 beforeRequest

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// common/request.jsexport

default {

  config: {

    baseURL: baseURL,

    // 响应拦截器

    beforeRequest() {

      return new Promise((resolve, reject) => {

        console.log('响应拦截器') resolve('123456')

      })

    },

    // 请求拦截器

    handleResponse() {}

  },

  // request 请求

  request() {

    return this.config.beforeRequest().then(opt => {

      console.log(opt)

    })

  }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

// pages/index/index.vue

import api from '@/common/request.js'

export default {

  data() {

    return {}

  },

  onLoad() {

    this.getData()

  },

  methods: {

    getData() {

      api.request()

    }

  }

}

在浏览器的控制台中查看打印的内容

可以看到成功打印出来,然后就可以将公共的的方法封装在响应拦截器中

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

// 可以从外部引入baseURL,也可以定义到config下的baseURL中

import baseURL from '@/common/baseURL.js'

export default {

  config: {

    baseURL: baseURL,

    // 处理token的方法

    getToken() {

      let token = uni.getStorageSync('token');

      if (!token) {

        return uni.reLaunch({

          url: '/pages/login/login'

        })

      }

      return token

    },

    // 响应拦截器

    beforeRequest(options = {}) {

      return new Promise((resolve, reject) => {

        options.url = this.baseURL + options.url;

        options.method = options.method || 'GET';

        // options.responseType = 'arraybuffer'

        // 封装自己的请求头

        options.header = {

          token: this.getToken()

        }

        resolve(options)

      })

    },

    // 请求拦截器

    handleResponse() {}

  },

  // request 请求

  request(options = {}) {

    return this.config.beforeRequest(options).then(opt => {

      // 返回 uni.request 

      return uni.request(opt)

    })

  }

}

1

2

3

4

5

6

7

8

9

10

// pages/index/index.vue

methods: {

  getData() {

    api.request({

      url: '/fish/tag/list'

    }).then(data => {

      console.log(data)

    })

  }

}

查看打印结果

封装请求拦截

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

// 可以从外部引入baseURL,也可以定义到config下的baseURL中

import baseURL from '@/common/baseURL.js'

export default {

  config: {

    baseURL: baseURL,

    // 处理token的方法

    getToken() {

      let token = uni.getStorageSync('token');

      if (!token) {

        return uni.reLaunch({

          url: '/pages/login/login'

        })

      }

      return token

    },

    // 响应拦截器

    beforeRequest(options = {}) {

      return new Promise((resolve, reject) => {

        options.url = this.baseURL + options.url;

        options.method = options.method || 'GET';

        // 封装自己的请求头

        options.header = {

          token: this.getToken()

        }

        resolve(options)

      })

    },

    // 请求拦截器

    handleResponse(data) {

      return new Promise((resolve, reject) => {

        const [err, res] = data;

        // 处理错误

        if (res && res.statusCode !== 200) {

          let msg = res.data.msg || '请求错误';

          uni.showToast({

            icon: 'none',

            title: msg

          }) return reject(msg);

        }

        if (err) {

          uni.showToast({

            icon: 'none',

            title: '请求错误'

          }) return reject(err);

        }

        return resolve(res.data)

      })

    }

  },

  // request 请求

  request(options = {}) {

    return this.config.beforeRequest(options).then(opt => {

      // 这里看不懂的可以看上面 uni.request 三种请求方式的第二种

      return uni.request(opt)

    }).then(res => this.config.handleResponse(res))

  }

}

智能机器人

除注明外的文章,均为来源:老汤博客,转载请保留本文地址!
原文地址:uniapp封装请求拦截器(封装请求拦截和响应拦截的方法)-老汤博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • c# 一个自定义日志类
  • 【JAVA 常用API】数据库字段存储JSON格式数据,JAVA中如何将List<Entity>或者对象实体转换为字符串
  • Linux shell编程学习笔记65: nice命令 显示和调整进程优先级
  • linux文本查看命令
  • 概率论原理精解【1】
  • 基于YOLO8的目标检测系统:开启智能视觉识别之旅
  • 【Linux】Linux的基本使用
  • 开源防病毒工具--ClamAV
  • linux 报错:bash: /etc/profile: 行 32: 语法错误:未预期的文件结束符
  • css性能优化的方法
  • 如何判断国民经济的好坏
  • 北京交通大学《深度学习》专业课,实验3卷积、空洞卷积、残差神经网络实验
  • 基于trace_id实现SpringCloudGateway网关的链路追踪
  • 比较 WordPress 、 Baklib 和 BetterDocs
  • Qt开发网络嗅探器02
  • [NodeJS] 关于Buffer
  • “大数据应用场景”之隔壁老王(连载四)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android优雅地处理按钮重复点击
  • Create React App 使用
  • laravel with 查询列表限制条数
  • Nodejs和JavaWeb协助开发
  • Selenium实战教程系列(二)---元素定位
  • supervisor 永不挂掉的进程 安装以及使用
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 分布式事物理论与实践
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 小程序开发中的那些坑
  • 一个SAP顾问在美国的这些年
  • 中文输入法与React文本输入框的问题与解决方案
  • 阿里云API、SDK和CLI应用实践方案
  • ‌移动管家手机智能控制汽车系统
  • #控制台大学课堂点名问题_课堂随机点名
  • $forceUpdate()函数
  • (02)Unity使用在线AI大模型(调用Python)
  • (21)起落架/可伸缩相机支架
  • (4)Elastix图像配准:3D图像
  • (5)STL算法之复制
  • (C#)获取字符编码的类
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (计算机网络)物理层
  • (九十四)函数和二维数组
  • (每日一问)基础知识:堆与栈的区别
  • (源码分析)springsecurity认证授权
  • (转)菜鸟学数据库(三)——存储过程
  • (转)德国人的记事本
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .Net组件程序设计之线程、并发管理(一)
  • :中兴通讯为何成功
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • []sim300 GPRS数据收发程序
  • [AIGC] Spring Interceptor 拦截器详解