之前写请求都是用别人封装好的,直接 import request 完事,自己第一次写还是一头雾水,学习了一波搞清楚了些,可以写简单的封装了。

首先要搞清楚为什么封装请求,同其他的封装一样,我们把不同请求里相同的代码抽离出来进行复用,提高编码效率。比如根域名的配置,响应失败的处理,token 的携带……这些是大多数请求都需要的,把它们封装起来就可以避免写重复的代码。那么怎样封装呢?根域名配置可以单独放在一个配置文件里,想用的时候引入一下就可以了;处理响应失败和携带 token 则要分别用到响应拦截器和请求拦截器。下面来一一说明。

在开发时经常使用的 axios 在小程序里用不了,本文使用了类似的 flyio。Fly.js 是一个支持所有JavaScript运行环境的基于Promise的、支持请求转发、强大的http请求库。文档地址:https://wendux.github.io/dist/#/doc/flyio/readme

首先创建一个 config.js 文件存储 baseurl:

  1. let baseurl = ""
  2.  
  3. if (process.env.NODE_ENV === 'development') {
  4. // 本地
  5. baseurl = 'https://xxx'
  6. // 预发
  7. // baseurl = 'https://xxx'
  8. // 正式
  9. // baseurl = 'https://xxx'
  10.  
  11. } else {
  12. // 预发
  13. // baseurl = 'https://xxx'
  14. // 正式
  15. baseurl = 'https://xxx'
  16. }
  17.  
  18. export default baseurl

再创建 api.js 文件进行请求封装:

  1. var Fly = require("./fly") //
  2. var fly = new Fly; //创建fly实例
  3. import baseurl from './config.js'
  4.  
  5. // 配置请求根域名
  6. fly.config.baseURL = baseurl;
  7.  
  8. // 配置响应拦截器
  9. fly.interceptors.response.use(
  10. (response) => {
  11. // 权限问题报错
  12. if (response.data.retcode == 10003 || response.data.retcode == 10004 || response.data.retcode == 10011) {
  13. uni.showModal({
  14. title: '温馨提示',
  15. content: '无权限访问或登录信息已过期,请返回登录页重新登录后重试!'
  16. })
  17. return Promise.reject(response.data)
  18. } else if (response.data.retcode != 0) {
  19. uni.showModal({
  20. title: '温馨提示',
  21. content: response.data.text,
  22. showCancel: false
  23. })
  24. return Promise.reject(response.data)
  25. } else {
  26. //只将请求结果的data字段返回
  27. return Promise.resolve(response.data)
  28. }
  29. },
  30. (err) => {
  31. console.log(err, 'err')
  32. //发生网络错误后会走到这里
  33. uni.showModal({
  34. title: '温馨提示',
  35. content: "网络请求异常:" + err.message
  36. })
  37. return Promise.reject("网络请求异常:" + err.message)
  38. }
  39. )
  40. // 配置请求拦截器
  41. fly.interceptors.request.use((request) => {
  42. // 请求头携带token,不要问我token怎么来的
  43. request.headers["token"] = uni.getStorageSync('token');
  44. return request;
  45. })
  46.  
  47. export default fly

在 main.js 文件里引入 api 并设置全局变量让它能够在全局调用:

  1. import Vue from 'vue'
  2. import App from './App'
  3.  
  4. import API from '@/common/api'
  5.  
  6. Vue.config.productionTip = false
  7.  
  8. Vue.prototype.$api = API
  9.  
  10. App.mpType = 'app'
  11.  
  12. const app = new Vue({
  13. ...App
  14. })
  15. app.$mount()

在页面里调用:

  1. this.$api.get('xxx/xxx')
  2. .then(res => {
  3. // 处理响应结果
  4. console.log(res)
  5. })
  6.  
  7. // 因为在请求封装里已经处理过响应失败的情况了,没有特殊情况可以不用catch

uniapp 基于 flyio 的 http 请求封装的更多相关文章

  1. 简单的基于Vue-axios请求封装

    具体实现思路=>封装之前需要用npm安装并引入axios,使用一个单独的js模块作为接口请输出对象,然后export dafult 这个对象. 1.首先我们需要在Vue实例的原型prototyp ...

  2. flyio 的请求封装

    1.安装flyio.js npm install flyio --save-dev 2.在util创建一个fly.js用于封装 import Vue from 'vue' var Fly=requir ...

  3. 基于 fetch 的请求封装

    原生 fetch 请求失败后(如无网络)状态会变成 reject 走 .catch .绝大多数情况下业务场景只需要给个 toast 等简单处理.每个请求都 .catch 会显得格外繁琐,并且如果不 . ...

  4. .NetCore简单封装基于IHttpClientFactory的HttpClient请求

    IHttpClientFactory是什么?为什么出现了IHttpClientFactory 一.IHttpClientFactory是什么? IHttpClientFactory是.netcore2 ...

  5. WebApi系列~基于单请求封装多请求的设计

    回到目录 怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能 ...

  6. iOS开发--Swift 基于AFNetworking 3.0的网络请求封装

    Swift和OC基于AFNetworking的网络请求流程相同, 就是语法不同, 对于Swift语法不是很清楚的同学, 建议多看看API文档, 自己多多尝试. 写过OC的应该都明白每句话做什么的, 就 ...

  7. vue-cli配置axios,并基于axios进行后台请求函数封装

    文章https://www.cnblogs.com/XHappyness/p/7677153.html已经对axios配置进行了说明,后台请求时可直接this.$axios直接进行.这里的缺点是后端请 ...

  8. webapi基于单请求封装多请求的设计【转】

    怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能包含多个子 ...

  9. 【uni-app】uni.request二次封装,更好的管理api接口和使用

    前言 之前写了一个Vue.js的axios二次封装(点击跳转),这次是uni-app,uni-app是基于vue.js框架的,我觉得是很好用的一个框架,而且一套代码编译那么多平台,非常节省成本,当然, ...

随机推荐

  1. SQL拦截器

    一.拦截SQL 1.slow log 2.general log 3.mycat sql拦截器 二.mycat sql拦截器 1.配置server.xml # 1.5可用 <system> ...

  2. Java 解决采集UTF-8网页空格变成问号乱码

    http://blog.csdn.net/bob007/article/details/27098875 使用此方法转换后,在列表中看到的正常,但是在详情页的文本框中查看到的就是 了,只好过滤掉所有的 ...

  3. CF834D

    题目链接:http://codeforces.com/contest/834/problem/D 题目大意:将一个有n个数的数列分成k段,每段的价值为该段中不同数字的个数,求k段的最大总价值. 解题思 ...

  4. js操作html的基本方法

    刚学了js操作html的基本方法,在写代码过程中,有很多格式不规范,忘记加双引号尤其重要,通常这 样的错误很容易范,并且这种错误很难找.随着代码学习量越来越多,很多写法容易搞混.今天记录一下,以便后期 ...

  5. 如何为Form表单的多个提交按钮指定不同的Action地址?

    这是我很久以前看到的一个技巧,但我忘记在哪里了,当时遇到这样的需求,做了笔记,现在整理成文章分享出来,因为我感觉这个小技巧还是挺有用的,这种应用场景也算比较常见,比如一个表单有"保存&quo ...

  6. Istio Polit-agent & Envoy 启动流程

    开篇 通过上一篇 Istio Sidecar注入原理 文章可以发现,在应用提交到kubernate部署时已经同时注入了Sidecar应用. 细心的话应该还可以发现,除了注入了istio-proxy应用 ...

  7. 如何使用JPA的@Formula注解?

    背景描述 我们经常会在项目中用到一些数据字典,在存储和传输时使用Code,在前端展示时使用Name,这样做的好处是便于系统维护,比如项目中用到了"医院"这个名称,如果后期需求发生变 ...

  8. 【Windows】win10:硬件良好,软件系统出错

    平台:戴尔G3, win10 现象:能正常开机,开机后前几分钟内能打开部分应用,经过大约两分钟后系统无法正常使用. 分析:此次问题出现再新购买的笔记本电脑中,鉴于电脑刚买,硬件坏的可能性很小,然而为了 ...

  9. [批处理教程之Git]001.Git 常用命令大全

    基本技巧 1.安装后的第一步 安装git后,第一件事你需要设置你的名字和邮箱,因为每次提交都需要这些信息. $ git config --global user.name "Some One ...

  10. Parrot os笔记本推荐

    parrot os基于debian开发的,因此同样适用于其他linux:笔记本集显最好,linux直接适用于intel,不用手动切换显卡,大多数linux玩家及pentester不需要高性能显卡,当然 ...