首页IT科技前端vue封装api然后调用(vue中axios的二次封装——vue 封装axios详细步骤)

前端vue封装api然后调用(vue中axios的二次封装——vue 封装axios详细步骤)

时间2025-06-12 00:34:47分类IT科技浏览4943
导读:一、为什么要封装axios...

一            、为什么要封装axios

    api统一管理            ,不管接口有多少                   ,所有的接口都可以非常清晰      ,容易维护            。

    通常我们的项目会越做越大            ,页面也会越来越多                   ,如果页面非常的少      ,直接用axios也没有什么大的影响      ,那页面组件多了起来                   ,上百个接口呢             ,这个时候后端改了接口      ,多加了一个参数什么的呢?那就只有找到那个页面                  ,进去修改             ,整个过程很繁琐,不易于项目的维护和迭代                   。

    这个时候如果我们统一的区管理接口                  ,需要修改某一个接口的时候直接在api里修改对应的请求                   ,是不是很方便呢?因为我们用的最多的还是get post请求,我们就可以针对封装      。

二                   、怎么封装 axios

1. 拿到项目和后端接口            ,首先要配置全局代理;

2. 接着全局封装axios和request.js;

3. 过滤axios请求方式                   ,控制路径      ,参数的格式            ,http.js;

4. 正式封装api.js;

5. 页面调用;

 三      、具体步骤

(一)vue项目的前期配置

   1. 终端输入

npm i axios -S

   2. 在项目中 main.js 文件中输入

import axios from "axios";

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

  修改项目中config目录下的 index.js文件            。【也可能是vue.config.js 文件】

use strict // Template version: 1.3.1 // see http://vuejs-templates.github.io/webpack for documentation. const path = require(path) module.exports = { dev: { // Paths assetsSubDirectory: static, assetsPublicPath: /, proxyTable: { /: { target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/: } }, /ws/*: { target: ws://127.0.0.1:8080, ws: true } }, // Various Dev Server settings host: localhost, // can be overwritten by process.env.HOST port: 8082, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined autoOpenBrowser: false, errorOverlay: true, notifyOnErrors: true, poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- // Use Eslint Loader? // If true, your code will be linted during bundling and // linting errors and warnings will be shown in the console. useEslint: true, // If true, eslint errors and warnings will also be shown in the error overlay // in the browser. showEslintErrorsInOverlay: false, /** * Source Maps */ // https://webpack.js.org/configuration/devtool/#development devtool: cheap-module-eval-source-map, // If you have problems debugging vue-files in devtools, // set this to false - it *may* help // https://vue-loader.vuejs.org/en/options.html#cachebusting cacheBusting: true, cssSourceMap: true }, build: { // Template for index.html index: path.resolve(__dirname, ../dist/index.html), // Paths assetsRoot: path.resolve(__dirname, ../dist), assetsSubDirectory: static, assetsPublicPath: /, /** * Source Maps */ productionSourceMap: true, // https://webpack.js.org/configuration/devtool/#production devtool: #source-map, // Gzip off by default as many popular static hosts such as // Surge or Netlify already gzip all static assets for you. // Before setting to `true`, make sure to: // npm install --save-dev compression-webpack-plugin productionGzip: false, productionGzipExtensions: [js, css], // Run the build command with an extra argument to // View the bundle analyzer report after build finishes: // `npm run build --report` // Set to `true` or `false` to always turn it on or off bundleAnalyzerReport: process.env.npm_config_report } }

 (三)封装axios实例 —— request.js

/**** request.js ****/ // 导入axios import axios from axios // 使用element-ui Message做消息提醒 import { Message} from element-ui; //1. 创建新的axios实例                   , const service = axios.create({ // 公共接口--这里注意后面会讲 baseURL: process.env.BASE_API, // 超时时间 单位是ms      ,这里设置了3s的超时时间 timeout: 3 * 1000 }) // 2.请求拦截器 service.interceptors.request.use(config => { //发请求前做的一些处理      ,数据转化                   ,配置请求头             ,设置token,设置loading等      ,根据需求去添加 config.data = JSON.stringify(config.data); //数据转化,也可以使用qs转换 config.headers = { Content-Type:application/json //配置请求头 } //如有需要:注意使用token的时候需要引入cookie方法或者用本地localStorage等方法                  ,推荐js-cookie //const token = getCookie(名称);//这里取token之前             ,你肯定需要先拿到token,存一下 //if(token){ //config.params = {token:token} //如果要求携带在参数中 //config.headers.token= token; //如果要求携带在请求头中 //} return config }, error => { Promise.reject(error) }) // 3.响应拦截器 service.interceptors.response.use(response => { //接收到响应数据并成功后的一些共有的处理,关闭loading等 return response }, error => { /***** 接收到异常响应的处理开始 *****/ if (error && error.response) { // 1.公共错误处理 // 2.根据响应码具体处理 switch (error.response.status) { case 400: error.message = 错误请求 break; case 401: error.message = 未授权                  ,请重新登录 break; case 403: error.message = 拒绝访问 break; case 404: error.message = 请求错误,未找到该资源 window.location.href = "/NotFound" break; case 405: error.message = 请求方法未允许 break; case 408: error.message = 请求超时 break; case 500: error.message = 服务器端出错 break; case 501: error.message = 网络未实现 break; case 502: error.message = 网络错误 break; case 503: error.message = 服务不可用 break; case 504: error.message = 网络超时 break; case 505: error.message = http版本不支持该请求 break; default: error.message = `连接错误${error.response.status}` } } else { // 超时处理 if (JSON.stringify(error).includes(timeout)) { Message.error(服务器响应超时                   ,请刷新当前页) } error.message = 连接服务器失败 } Message.error(error.message) /***** 处理结束 *****/ //如果不需要错误处理,以上的处理过程都可省略 return Promise.resolve(error.response) }) //4.导入文件 export default service

四            、封装请求——http.js 

/**** http.js ****/ // 导入封装好的axios实例 import request from ./request const http ={ /** * methods: 请求 * @param url 请求地址 * @param params 请求参数 */ get(url,params){ const config = { method: get, url:url } if(params) config.params = params return request(config) }, post(url,params){ const config = { method: post, url:url } if(params) config.data = params return request(config) }, put(url,params){ const config = { method: put, url:url } if(params) config.params = params return request(config) }, delete(url,params){ const config = { method: delete, url:url } if(params) config.params = params return request(config) } } //导出 export default http

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

import request from "@/utils/request.js"; import qs from "qs"; const baseUrl = /api/jwt/auth //登录 export function authCodeLogin(params) { return request({ url: baseUrl + "/authCodeLogin/" + params.code, method: "get", }); } //退出 export function authLogout(params) { return request({ url: baseUrl + "/logout", method: "get", }); } //获取用户数据 export function getUserInfo(params) { return request({ url: baseUrl + "/getUserInfo", method: "get", params:qs.stringfy(params) }); } //其实                   ,也不一定就是params      ,也可以是 query 还有 data 的呀! //params是添加到url的请求字符串中的            ,用于get请求                   。会将参数加到 url后面      。所以                   ,传递的都是字符串      。无法传递参数中含有json格式的数据 //而data是添加到请求体(body)中的      , 用于post请求                   。添加到请求体(body)中      ,json 格式也是可以的             。

 六      、如何在vue文件中调用

    用到哪个api 就调用哪个接口

import { authCodeLogin } from @/api/api.js getModellogin(code){ let params = { code: code, } authCodeLogin(params).then(res=>{ if (res.code === 200) { localStorage.clear() // 菜单 this.$store.dispatch(saveMenu, []) // this.getFloorMenu() // this.getmenu() this.$router.push(/) }else{ console.log(error); } }) },

   其实还挺简单的!~

   记录一下                   ,方便遗忘的时候拿起来用      。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
如何提高网站seo排名(网站如何优化排名) 如何提高网站排名的方法(如何提高网站的排名)