当前位置:   article > 正文

利用vue怎么对axios进行封装_vue 多域名 api 封装

vue 多域名 api 封装
  1. cnpm install axios --save-dev;
  2. // 安装axios
  3. cnpm install qs --save-dev;
  4. // 安装qs模块,用来序列化post类型的数据,否则后端无法接收到数据

模块引入

在src目录下创建一个service目录,用于存放接口封装的相关文件。然后在service目录中创建service.js,用于axios、qs模块的引入,并在此文件中对axios进行封装。代码如下(接口域名只有一个的情况):

  1. import axios from 'axios' //引入axios
  2. import qs from 'qs' //引入qs,用来序列化post类型的数据,否则后端无法接收到数据
  3. // 设置post请求头
  4. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
  5. axios.defaults.withCredentials = false;//在跨域请求时,不会携带用户凭证;返回的 response 里也会忽略 cookie
  6. //创建axios实例,请求超时时间为300秒
  7. const instance = axios.create({
  8. timeout: 300000,
  9. });
  10. //请求和响应拦截可以根据实际项目需求进行编写
  11. // 请求发起前拦截
  12. instance.interceptors.request.use((config) => {
  13. //这里可以对接口请求头进行操作 如:config.headers['X-Token'] = token
  14. console.log("请求拦截",config);
  15. return config;
  16. }, (error) => {
  17. // Do something with request error
  18. return Promise.reject(error)
  19. })
  20. // 响应拦截(请求返回后拦截)
  21. instance.interceptors.response.use(response => {
  22. console.log("响应拦截",response);
  23. return response;
  24. }, error => {
  25. console.log('catch', error)
  26. return Promise.reject(error)
  27. })
  28. //按照请求类型对axios进行封装
  29. const api={
  30. get(url,data){
  31. return instance.get(url,{params:data})
  32. },
  33. post(url,data){
  34. return instance.post(url,qs.stringify(data))
  35. },
  36. }
  37. export {api}

上述代码是接口域名只有一个的情况(多数情况),当接口域名有多个的时候(少数情况),我们需要对之前的封装进行改造,代码如下:

  1. import axios from 'axios' //引入axios
  2. import qs from 'qs' //引入qs,用来序列化post类型的数据,否则后端无法接收到数据
  3. // 设置post请求头
  4. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
  5. axios.defaults.withCredentials = false;//在跨域请求时,不会携带用户凭证;返回的 response 里也会忽略 cookie
  6. //创建axios实例,请求超时时间为300秒,因为项目中有多个域名,所以对应的也要创建多个axios实例
  7. const instanceA = axios.create({
  8. timeout: 300000,
  9. });
  10. const instanceB = axios.create({
  11. timeout: 300000,
  12. });
  13. //如果项目为单一域名,这里可以不用进行配置,当项目接口有多个域名时,要对axios实例基础路径进行配置,否则在项目生产环境中无法进行区别调用
  14. if (process.env.NODE_ENV == 'production') {
  15. instanceA.defaults.baseURL = 'https://www.production_a.com';
  16. instanceB.defaults.baseURL = 'https://www.production_b.com';
  17. }
  18. //请求和响应拦截可以根据实际项目需求进行编写
  19. // 请求发起前拦截
  20. instanceA.interceptors.request.use((config) => {
  21. //这里可以对接口请求头进行操作 如:config.headers['X-Token'] = token
  22. console.log("请求拦截",config);
  23. return config;
  24. }, (error) => {
  25. // Do something with request error
  26. return Promise.reject(error)
  27. })
  28. instanceB.interceptors.request.use((config) => {
  29. console.log("请求拦截",config);
  30. return config;
  31. }, (error) => {
  32. // Do something with request error
  33. return Promise.reject(error)
  34. })
  35. // 响应拦截(请求返回后拦截)
  36. instanceA.interceptors.response.use(response => {
  37. console.log("响应拦截",response);
  38. return response;
  39. }, error => {
  40. console.log('catch', error)
  41. return Promise.reject(error)
  42. })
  43. instanceB.interceptors.response.use(response => {
  44. console.log("响应拦截",response);
  45. return response;
  46. }, error => {
  47. console.log('catch', error)
  48. return Promise.reject(error)
  49. })
  50. //按照请求类型对axios进行封装
  51. const api={
  52. get(url,data){
  53. return instanceA.get(url,{params:data})
  54. },
  55. post(url,data){
  56. return instanceA.post(url,qs.stringify(data))
  57. },
  58. doGet(url,data){
  59. return instanceB.get(url,{params:data})
  60. },
  61. doPost(url,data){
  62. return instanceB.post(url,qs.stringify(data))
  63. }
  64. }
  65. export {api}

上述代码中有根据生产环境对axios实例的基础路径进行配置,如果项目中有多个环境(如:测试环境等),则需要对CLI4脚手架环境变量进行配置

api接口统一管理

将api接口按照功能模块进行拆分,把同一模块下的接口写在同一个文件中进行统一管理,这样代码会更容易维护。比如我们的项目中有新闻模块,音乐模块等。我们就在serviec目录中创建news.js、music.js文件,用于管理各自模块的所有api接口,这里我只拿news.js文件为例,代码如下:

  1. import {api} from "./service.js";
  2. const news={
  3. getNewsList(){//获取新闻列表
  4. return api.get("api/news/getNewsList")
  5. },
  6. editNewsDetail(data){//修改新闻详情
  7. return api.post("api/news/editNewsDetail",data);
  8. }
  9. }
  10. export default news;

为了更方便在项目中调用这些封装好的接口,我们需要将这些接口挂载到vue的原型上,首先我们要在service目录中创建api.js文件,将所有模块的api管理文件引入进来,然后进行统一导出,代码如下:

  1. //引入相关api管理模块
  2. import news from "./news.js";
  3. //进行统一导出
  4. export default {
  5. news
  6. }

找到项目中的main.js文件,将接口挂载到vue的原型上,代码如下:

  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. import router from './router'
  4. import store from './store'
  5. import axios from 'axios'
  6. Vue.prototype.axios=axios
  7. Vue.config.productionTip = false
  8. import api from "./service/api.js";
  9. //将封装的接口挂载到vue原型上
  10. Vue.prototype.$api = api;
  11. new Vue({
  12. router,
  13. store,
  14. render: h => h(App)
  15. }).$mount('#app')

然后我们在项目创建完成时自动生成的模板文件App.vue调用封装好的接口,代码如下:

  1. <template>
  2. <div id="app">
  3. <div id="nav">
  4. <router-link to="/">Home</router-link> |
  5. <router-link to="/about">About</router-link>
  6. <button @click="getN">接口封装getN</button>
  7. <button @click="postN">接口封装postN</button>
  8. </div>
  9. <router-view/>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. methods:{
  15. getN(){
  16. this.$api.news.getNewsList().then((res)=>{
  17. console.log(res);
  18. })
  19. },
  20. postN(){
  21. let openid="oO5tQ5VMPpuzLqwfXhpmwjqwSANM";
  22. let productCodes="pro-1337270496655446016";
  23. this.$api.news.editNewsDetail({openid,productCodes}).then((res)=>{
  24. alert(res.data.msg);
  25. })
  26. }
  27. }
  28. }
  29. </script>
  30. <style lang="scss">
  31. #app {
  32. font-family: Avenir, Helvetica, Arial, sans-serif;
  33. -webkit-font-smoothing: antialiased;
  34. -moz-osx-font-smoothing: grayscale;
  35. text-align: center;
  36. color: #2c3e50;
  37. }
  38. #nav {
  39. padding: 30px;
  40. a {
  41. font-weight: bold;
  42. color: #2c3e50;
  43. &.router-link-exact-active {
  44. color: #42b983;
  45. }
  46. }
  47. }
  48. </style>

配置代理

因为我们要在本地环境进行测试,这就涉及到了跨域问题,为了解决跨域问题,我们可以进行代理的配置,在项目根目录中创建vue.config.js文件,然后可以对项目进行各种配置,代理的配置方法如下:

  1. // vue.config.js
  2. module.exports = {
  3. // 输出文件目录
  4. outputDir: "dist",
  5. // eslint-loader 是否在保存的时候检查
  6. lintOnSave: false,
  7. // 基本路径
  8. publicPath: process.env.NODE_ENV === "production" ? "./" : "/",
  9. devServer: {
  10. host: "localhost",
  11. port: 8080,
  12. open: true,
  13. hotOnly: true, // 热更新
  14. // 设置代理
  15. proxy: {
  16. "/api": {
  17. // 本地mock服务器
  18. target: "https://www.xxxx.com/xxx/",
  19. changeOrigin: true,
  20. ws: false,
  21. },
  22. //如果项目中存在多个域名接口,可依次进行配置
  23. "/apib":{
  24. target: "https://www.xxxx.com/xxx/",
  25. changeOrigin: true,
  26. ws: false,
  27. },
  28. },
  29. },
  30. };

代理配置好了之后,就可以运行项目了,命令行中输入npm run serve,项目启动好了之后,就可以进入页面点击按钮,测试之前做的封装是否好用。

上述内容就是利用vue怎么对axios进行封装,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

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

闽ICP备14008679号