如何封装前端api请求方法

原文链接: https://juejin.im/post/5c4bc090e51d4503834d980f

这一章节中 我们使用vue-cli3 来创建项目 官网文档(cli.vuejs.org/zh/)

创建好项目后先安装axios(这一次我们使用axios配合讲解这一章节)


     
     
  1. cnpm install axios --save-dev
  2. 复制代码

     
     
  1. "devDependencies": {
  2. "@vue/cli-plugin-babel": "^3.0.0-rc.12",
  3. "@vue/cli-plugin-eslint": "^3.0.0-rc.12",
  4. "@vue/cli-service": "^3.0.0-rc.12",
  5. "axios": "^0.18.0",
  6. "babel-eslint": "^10.0.1",
  7. "eslint": "^5.8.0",
  8. "eslint-plugin-vue": "^5.0.0",
  9. "vue-template-compiler": "^2.5.21"
  10. },
  11. 复制代码

关于package.json 具体讲解 详情请见楼主具体章节

首先我们在src目录下建立api 文件夹


     
     
  1. src
  2. ——api
  3. ——index.js export 导出 api各种文件(注: exportexport default 有区别 详情请看楼主具体章节)
  4. ——http.js 这个js文件再一次的封装了axios,更方便的为整个项目服务(Axios 是一个基于 promise 的 HTTP 库)
  5. ——api.js 配置了与后台交互时候需要携带的静态属性如版本 version:v1 以及公用的路径basePath 等等
  6. ——main.js
  7. 复制代码

     
     
  1. import axios from 'axios'
  2. import qs from 'qs'
  3. 我们需要定义前后端交互常见的几种方法
  4. export const methods = {
  5. put: 'put',
  6. get: 'get',
  7. post: 'post',
  8. delete: 'delete'
  9. }
  10. const formData = data => {
  11. return qs.stringify(data, { indices: false })
  12. }
  13. 自定义axios配置 具体参数可以参考网上中文文档
  14. const instance = axios.create({
  15. timeout: process.env.NODE_ENV === 'production' ? 15000 : 600000
  16. })
  17. export const request = ({ method = methods.get, url, data, headers, token = true }) => {
  18. /**
  19. * 封装axios请求方法
  20. * @param url 请求地址 必传
  21. * @param method 请求方法 默认get请求
  22. * @param data 请求数据
  23. * @param headers 请求头
  24. * @param token 是否需要携带token
  25. */
  26. if (!url) {
  27. console.error(url, 'API function call requires uri argument')
  28. return
  29. }
  30. 楼主项目使用 localStorage作为前端缓存token方式
  31. let tokenInfo = JSON.parse(window.localStorage.getItem( 'token')) || {}
  32. if (token && tokenInfo && tokenInfo.token) {
  33. window.location.href = '/login'
  34. return
  35. }
  36. headers = {
  37. ...headers,
  38. 'accessToken': tokenInfo.token
  39. }
  40. // 默认是form表单传递数据 默认
  41. if (!headers[ 'Content-Type']) {
  42. headers[ 'Content-Type'] = 'application/x-www-form-urlencoded'
  43. }
  44. // 根据Content-Type 来决定 data 是否需要格式话
  45. if (headers[ 'Content-Type'] === 'application/x-www-form-urlencoded' && (typeof data) !== 'string') {
  46. data = formData(data)
  47. }
  48. // 这里要注意吧indices 设置为 false 因为前端在传form表单的数据的时候 如果数据里面有数组类型 qs库会吧数组索引转换成object 来发送给后端 这样后端是识别不了的
  49. if (method === 'get' || method === 'GET') {
  50. if (data) {
  51. if ((typeof data) !== 'string') {
  52. data = formData(data)
  53. }
  54. // 拼装get请求方法 判断请求参数是否存在
  55. url = url + '?' + data
  56. }
  57. }
  58. let req = instance({ method, url, data, headers })
  59. req.catch(error => {
  60. console.warn( '[axios request]', error)
  61. window._vue. $Message.error( '网络错误,请重试')
  62. })
  63. return req
  64. }
  65. function resetToken (config) {
  66. /**
  67. * 处理token
  68. * 如 登陆时 服务端会返回一个过期时间 在每次发送请求的时候 验证本地token是否过期了 如果是已经过期了 那么直接吧config中携带的token 替换掉
  69. * 如 即将过期 吧缓存中的token重新置换 以待下一次请求
  70. */
  71. return config
  72. }
  73. // axios 拦截器
  74. instance.interceptors.request.use( function (config) {
  75. /**
  76. * 发送之前要做什么
  77. * 例如 token 是有时效的 在token过期之前需要重新请求服务端来兑换新的token
  78. */
  79. return resetToken(config)
  80. // return config
  81. }, function (error) {
  82. /**
  83. * 请求错误 比如说网络失败啊 什么的
  84. */
  85. return Promise.reject(error)
  86. })
  87. // 响应错误
  88. instance.interceptors.response.use( function (response) {
  89. /**
  90. * 对响应的数据处理 比如说 前后端中间层 当后端的给的数据 不能完全适配前端的时候 可以在这里加个中间层 在中间层 来处理数据 并且返回给前端
  91. */
  92. return response
  93. }, function (error) {
  94. /**
  95. * 服务读响应错误
  96. * 可以写一些常用的处理逻辑 比如说 页面404啊 服务端500 服务器发布啊等常见的错误。(日后可以在这块来收集日志)
  97. * 以及一些loading处理
  98. */
  99. return Promise.reject(error)
  100. })
  101. 复制代码

写的不好 多谅解!!!

转载于:https://juejin.im/post/5c4bc090e51d4503834d980f

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值