当前位置:   article > 正文

vue项目封装axios-封装请求-封装公共的api和调用请求_vue封装axios数据请求及调用

vue封装axios数据请求及调用

在做vue中大型项目的时候,官方推荐使用axios,但是原生的axios可能对项目的适配不友好,所以,在工程开始的来封装一下axios,保持全项目数据处理的统一性。此文主要讲在vue-cil项目中如何封装axios,封装请求,封装公共的api,页面如何调用请求。

如果你能看到这篇文章,鉴于有很多小白可能会参考我这篇文章来进行前期配置,特说明下正式配置路线:

  1. 拿到项目及后台接口,首先做的是配置全局代理及第二点
  2. 全局封装axios及第三点request.js;
  3. 过滤axios请求方式,控制路径及参数的格式及第四点http.js;
  4. 正式封装api及第五点api.js;
  5. 页面调用;

正文

一、vue项目的前期配置

新建vue项目,下载axios,并在main.js中导入axios

npm i axios -S
  1. //main.js
  2. import axios from "axios";

二、配置config文件中的代理地址

在项目config目录下的修改 index.js文件,这里是主要书写配置多个后台接口。关于代理可能出现的问题,可以查看我的另一篇文档VueCil代理本地proxytable报错的解析

vue cil2旧版本的代理配置——config/index.js

  1. dev: {
  2. // Paths
  3. assetsSubDirectory: 'static',
  4. assetsPublicPath: '/',
  5. // 后端请求地址代理,配置后testIp再之后的页面调用时就直接指代 http://197.82.15.15:8088
  6. proxyTable: {
  7. '/testIp': {
  8. target: 'http://197.82.15.15:8088',
  9. changeOrigin: true,
  10. pathRewrite: {
  11. '^/testIp': ''
  12. }
  13. },
  14. '/elseIp': {
  15. target: 'http://182.83.19.15:8080',
  16. changeOrigin: true,
  17. pathRewrite: {
  18. '^/esleIp': ''
  19. }
  20. },
  21. },
  22. // Various Dev Server settings
  23. host: 'localhost', // can be overwritten by process.env.HOST
  24. port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
  25. autoOpenBrowser: false,
  26. errorOverlay: true,
  27. notifyOnErrors: true,
  28. poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
  29. /**
  30. * Source Maps
  31. */
  32. // https://webpack.js.org/configuration/devtool/#development
  33. devtool: 'cheap-module-eval-source-map',
  34. // If you have problems debugging vue-files in devtools,
  35. // set this to false - it *may* help
  36. // https://vue-loader.vuejs.org/en/options.html#cachebusting
  37. cacheBusting: true,
  38. cssSourceMap: true
  39. },

vuecil 3+ 新版本的代理配置–vue.config.js 文件

关于多代理配置:

  1. devServer: {
  2. overlay: { // 让浏览器 overlay 同时显示警告和错误
  3. warnings: true,
  4. errors: true
  5. },
  6. host: "localhost",
  7. port: 8080, // 端口号
  8. https: false, // https:{type:Boolean}
  9. open: false, //配置后自动启动浏览器
  10. hotOnly: true, // 热更新
  11. // proxy: 'http://localhost:8080' // 配置跨域处理,只有一个代理
  12. proxy: { //配置多个代理
  13. "/testIp": {
  14. target: "http://197.0.0.1:8088",
  15. changeOrigin: true,
  16. ws: true,//websocket支持
  17. secure: false,
  18. pathRewrite: {
  19. "^/testIp": "/"
  20. }
  21. },
  22. "/elseIp": {
  23. target: "http://197.0.0.2:8088",
  24. changeOrigin: true,
  25. //ws: true,//websocket支持
  26. secure: false,
  27. pathRewrite: {
  28. "^/elseIp": "/"
  29. }
  30. },
  31. }
  32. }

如果有多后台,就可以在api文件夹下另外新建一个elseApi.js ,书写当前ip下的接口请求。方法同上,只是 let resquest = "/elseIp/request/" 调用的时候把端口更改一下。

三、封装axios实例 —— request.js

在项目src目录下新建utils文件夹,然后在其中新建 request.js文件,这个文件是主要书写axios的封装过程。

  1. /**** request.js ****/
  2. // 导入axios
  3. import axios from 'axios'
  4. // 使用element-ui Message做消息提醒
  5. import { Message} from 'element-ui';
  6. //1. 创建新的axios实例,
  7. const service = axios.create({
  8. // 公共接口--这里注意后面会讲
  9. baseURL: process.env.BASE_API,
  10. // 超时时间 单位是ms,这里设置了3s的超时时间
  11. timeout: 3 * 1000
  12. })
  13. // 2.请求拦截器
  14. service.interceptors.request.use(config => {
  15. //发请求前做的一些处理,数据转化,配置请求头,设置token,设置loading等,根据需求去添加
  16. config.data = JSON.stringify(config.data); //数据转化,也可以使用qs转换
  17. config.headers = {
  18. 'Content-Type':'application/x-www-form-urlencoded' //配置请求头
  19. }
  20. //注意使用token的时候需要引入cookie方法或者用本地localStorage等方法,推荐js-cookie
  21. const token = getCookie('名称');//这里取token之前,你肯定需要先拿到token,存一下
  22. if(token){
  23. config.params = {'token':token} //如果要求携带在参数中
  24. config.headers.token= token; //如果要求携带在请求头中
  25. }
  26. return config
  27. }, error => {
  28. Promise.reject(error)
  29. })
  30. // 3.响应拦截器
  31. service.interceptors.response.use(response => {
  32. //接收到响应数据并成功后的一些共有的处理,关闭loading等
  33. return response
  34. }, error => {
  35. /***** 接收到异常响应的处理开始 *****/
  36. if (error && error.response) {
  37. // 1.公共错误处理
  38. // 2.根据响应码具体处理
  39. switch (error.response.status) {
  40. case 400:
  41. error.message = '错误请求'
  42. break;
  43. case 401:
  44. error.message = '未授权,请重新登录'
  45. break;
  46. case 403:
  47. error.message = '拒绝访问'
  48. break;
  49. case 404:
  50. error.message = '请求错误,未找到该资源'
  51. window.location.href = "/NotFound"
  52. break;
  53. case 405:
  54. error.message = '请求方法未允许'
  55. break;
  56. case 408:
  57. error.message = '请求超时'
  58. break;
  59. case 500:
  60. error.message = '服务器端出错'
  61. break;
  62. case 501:
  63. error.message = '网络未实现'
  64. break;
  65. case 502:
  66. error.message = '网络错误'
  67. break;
  68. case 503:
  69. error.message = '服务不可用'
  70. break;
  71. case 504:
  72. error.message = '网络超时'
  73. break;
  74. case 505:
  75. error.message = 'http版本不支持该请求'
  76. break;
  77. default:
  78. error.message = `连接错误${error.response.status}`
  79. }
  80. } else {
  81. // 超时处理
  82. if (JSON.stringify(error).includes('timeout')) {
  83. Message.error('服务器响应超时,请刷新当前页')
  84. }
  85. error.message = '连接服务器失败'
  86. }
  87. Message.error(error.message)
  88. /***** 处理结束 *****/
  89. //如果不需要错误处理,以上的处理过程都可省略
  90. return Promise.resolve(error.response)
  91. })
  92. //4.导入文件
  93. export default service

特殊说明:

鉴于有很多朋友问关于数据转换这块的问题,特在页面中单独回复一下!

  1. config.data = JSON.stringify(config.data);
  2. config.headers = { 'Content-Type':'application/x-www-form-urlencoded' }
  3. const token = getCookie('名称')
  4. if(token){
  5. config.params = {'token':token} ;
  6. config.headers.token= token;
  7. }

上述的代码都是请求的配置项,非必须,也是分情况的,data/headers /params 这种本身的参数都有多种,和后台沟通,需要什么就配什么!
config.data = JSON.stringify(config.data);为什么不用qs.stringify,因为我的后台想要的只是json类型的传参,而qs转换会转换成为键值对拼接的字符串形式。当然你们后台需要传递字符串类型参数,那就换成qs或者其他格式方式。
const token = getCookie('名称')这是token的取值,在取之前你肯定需要发请求拿到token,然后setCookie存起来,而名称就是你存的token的名称,每个人的不一样;
config.headers = { 'Content-Type':'application/x-www-form-urlencoded' }请求头内容的配置,也是不同的,application/x-www-form-urlencoded :form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式),你可以根据实际情况去配置自己需要的;
以上
我已经举了很清晰的例子,写代码的过程是自己动脑去搭建工程的,希望能看到我文章的各位,善于搜索,善于思考,善于总结;
当然我很喜欢帮大家解决问题,但是相关的基础问题,还是建议自己去学习掌握。

四、封装请求——http.js

在项目src目录下的utils文件夹中新建 http.js文件,这个文件是主要书写几种请求的封装过程。

  1. /**** http.js ****/
  2. // 导入封装好的axios实例
  3. import request from './request'
  4. const http ={
  5. /**
  6. * methods: 请求
  7. * @param url 请求地址
  8. * @param params 请求参数
  9. */
  10. get(url,params){
  11. const config = {
  12. method: 'get',
  13. url:url
  14. }
  15. if(params) config.params = params
  16. return request(config)
  17. },
  18. post(url,params){
  19. const config = {
  20. method: 'post',
  21. url:url
  22. }
  23. if(params) config.data = params
  24. return request(config)
  25. },
  26. put(url,params){
  27. const config = {
  28. method: 'put',
  29. url:url
  30. }
  31. if(params) config.params = params
  32. return request(config)
  33. },
  34. delete(url,params){
  35. const config = {
  36. method: 'delete',
  37. url:url
  38. }
  39. if(params) config.params = params
  40. return request(config)
  41. }
  42. }
  43. //导出
  44. export default http

五、正式封装API,用于发送请求——api.js

在项目src目录下新建api文件夹,然后在其中新建 api.js文件,这个文件是主要书写API的封装过程。

写法一:适合分类导出

  1. import http from '../utils/http'
  2. //
  3. /**
  4. * @parms resquest 请求地址 例如:http://197.82.15.15:8088/request/...
  5. * @param '/testIp'代表vue-cil中config,index.js中配置的代理
  6. */
  7. let resquest = "/testIp/request/"
  8. // get请求
  9. export function getListAPI(params){
  10. return http.get(`${resquest}/getList.json`,params)
  11. }
  12. // post请求
  13. export function postFormAPI(params){
  14. return http.post(`${resquest}/postForm.json`,params)
  15. }
  16. // put 请求
  17. export function putSomeAPI(params){
  18. return http.put(`${resquest}/putSome.json`,params)
  19. }
  20. // delete 请求
  21. export function deleteListAPI(params){
  22. return http.delete(`${resquest}/deleteList.json`,params)
  23. }

写法二:使用全部导出

  1. import http from '../utils/http'
  2. //
  3. /**
  4. * @parms resquest 请求地址 例如:http://197.82.15.15:8088/request/...
  5. * @param '/testIp'代表vue-cil中config,index.js中配置的代理
  6. */
  7. let resquest = "/testIp/request/"
  8. // get请求
  9. export default{
  10. getListAPI(params){
  11. return http.get(`${resquest}/getList.json`,params)
  12. },
  13. postFormAPI(params){
  14. return http.post(`${resquest}/postForm.json`,params)
  15. }
  16. }

注意:一个项目中如果后台请求不是同一个ip,而是多个ip的时候,可以在api文件夹下建立多个js,用来调用请求。
我们看下之前遗留的一个问题:

  1. //创建新的axios实例,
  2. const service = axios.create({
  3. baseURL: process.env.BASE_API,
  4. timeout: 3 * 1000
  5. })

在之前封装公共接口的baseUrl时候,用了webpack中的全局变量process.env.BASE_API,而不是直接写死ip,也是为了适应多个后台或者开发的时候的api地址和发布的时候的api地址不一样这种情况。

以上 关于配置环境 和接口 基本搭建完毕,下面看一下调用:

六、如何在vue文件中调用

方法一:用到哪个api 就调用哪个接口——适用于上文接口分类导出;

  1. import {getListAPI,postFormAPI, putSomeAPI, deleteListAPI} from '@/api/api'
  2. methods: {
  3. //promise调用,链式调用, getList()括号内只接受参数;
  4. // get不传参
  5. getList() {
  6. getListAPI().then(res => console.log(res)).catch(err => console.log(err))
  7. },
  8. //post传参
  9. postForm(formData) {
  10. let data = formData
  11. postFormAPI(data).then(res => console.log(res)).catch(err => console.log(err))
  12. },
  13. //async await同步调用
  14. async postForm(formData) {
  15. const postRes = await postFormAPI(formData)
  16. const putRes = await putSomeAPI({data: 'putTest'})
  17. const deleteRes = await deleteListAPI(formData.name)
  18. // 数据处理
  19. console.log(postRes);
  20. console.log(putRes);
  21. console.log(deleteRes);
  22. },
  23. }

方法二 :把api全部导入,然后用哪个调用哪个api——适用于全部导出

  1. import api from '@/api/api'
  2. methods: {
  3. getList() {
  4. api.getListAPI(data).then(res => {
  5. //数据处理
  6. }).catch(err => console.log(err))
  7. }
  8. }

结语

以上就详细介绍了,在vue-cil项目中 如何封装axios,封装请求,封装公共的api,配置多个接口,页面如何调用请求等问题,都是亲测有用的~ 但是这种封装方法的话,更适合大中型项目,配置比较合理,如果是自己小项目,就直接用axios就完事了

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

闽ICP备14008679号