vue 项目接口管理的实现


Posted in Javascript onJanuary 17, 2019

在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,如何定义呢?

方法可能不只一种,本文使用axios+async/await进行接口的统一管理

本文使用vue-cli生成的项目举例

举例

拿segmentfault的官网简单举个例子,先看一下官网

vue 项目接口管理的实现

看下网站,脑补一下后台给出的文档,如果后台不傻的话给出的文档肯定分模块的,假设后台给出的文档分为了以下几个模块(假设的,不要较真哈)

  • 资讯模块 (我的订阅、热门资讯)
  • 问答模块
  • 专栏模块
  • 讲堂模块
  • 圈子模块
  • 发现模块
  • 个人信息模块
  • 用户登录注册模块
  • ...还有其他很多

一般来说,网站的首页都是复杂的,会用到很多其他页面也会用到api,所以接口统一管理可以做到api的复用

vue 项目接口管理的实现

那么如何做呢?

动手

1.首先,在src目录下新建一个文件夹,我这里叫apis,后台提供的所有接口都在这里定义

cd src #切换到src目录
mkdir apis #新建apis文件

2.第二步,按照后台文档划分的模块新建js文件,这里简单举个例子

  • 资讯模块: info.js
  • 登录注册模块: member.js
  • 个人信息模块 user_info.js
  • ....
cd apis #切换到apis目录
touch info.js member.js user_info.js #新建js文件

现在的目录大概是这个样子

src
  apis
    info.js
    member.js
    user_info.js
  main.js

3.第三步,需要引入axios做相应的配置

在apis下新建一个文件夹,叫http.js,在里面做axios相应的配置

touch http.js //新建http.js文件

配置如下:

import axios from 'axios'

//创建axios的一个实例 
var instance = axios.create({
  baseURL:xxx,
  timeout: 6000
})


//------------------- 一、请求拦截器 忽略
instance.interceptors.request.use(function (config) {

  return config;
}, function (error) {
  // 对请求错误做些什么
  
  return Promise.reject(error);
});

//----------------- 二、响应拦截器 忽略
instance.interceptors.response.use(function (response) {
  
  return response.data;
}, function (error) {
  // 对响应错误做点什么
  return Promise.reject(error);
});


export default function (method, url, data = null) {
  method = method.toLowerCase();
  if (method == 'post') {
    return instance.post(url, data)
  } else if (method == 'get') {
    return instance.get(url, { params: data })
  } else if (method == 'delete') {
    return instance.delete(url, { params: data })
  }else if(method == 'put'){
    return instance.put(url,data)
  }else{
    console.error('未知的method'+method)
    return false
  }
}

配置简要说明一下:

  • 引入axios,新建了个axios的实例(axios的实例的axios的功能一样)
  • 请求拦截器响应拦截器不是本文重点,略过
  • 第30行代码及以后是重点,拉出来重点看一下
/**
 * 使用es6的export default导出了一个函数,导出的函数代替axios去帮我们请求数据,
 * 函数的参数及返回值如下:
 * @param {String} method 请求的方法:get、post、delete、put
 * @param {String} url   请求的url:
 * @param {Object} data  请求的参数
 * @returns {Promise}   返回一个promise对象,其实就相当于axios请求数据的返回值
 */
export default function (method, url, data = null) {
  method = method.toLowerCase();
  if (method == 'post') {
    return instance.post(url, data)
  } else if (method == 'get') {
    return instance.get(url, { params: data })
  } else if (method == 'delete') {
    return instance.delete(url, { params: data })
  }else if(method == 'put'){
    return instance.put(url,data)
  }else{
    console.error('未知的method'+method)
    return false
  }
}

4.第四步、在apis下面的js文件中引入http.js导出的函数,拿其中一个文件member.js说明

//member.js 用于定义用户的登录、注册、注销等

import req from './http.js'

//定义接口 

//在这里定义了一个登陆的接口,把登陆的接口暴露出去给组件使用
export const LOGIN =params=>req('post','/operator/login',params)
//这里使用了箭头函数,转换一下写法:
//export const LOGIN=function(req){
//  return req('post','/operator/login',params)
//}

//定义注册接口
export const REG =params=>req('post','/operator/reg',params)
//定义注销接口
export const LOGOUT =params=>req('post','/operator/logout',params)

5.第五步,在组件中使用接口

登陆组件Login.js使用登录接口

//Login.vue
<template>
  <div>
    <input type='text' v-modal='user.userId'>
    <input type='text' v-modal='user.pass'>
  </div>
</template>
<script>
  //1. 引入登录的接口定义
  import {LOGIN} from '../../apis/user.js'
  export default{
    data(){
      return {
        user:{
          userId:'',
          pass:''
        }
      }
    },
    methods{
    //2. 定义登录的逻辑
    async login(){
      //2.1 awiat LOGIN(this.user) 
       //等待LOGIN(this.user)执行完,
       //把返回值给user_info
      
      let user_info=await LOGIN(this.user)
      
      //2.2假设登录成功,返回的数据应该是 
        //user_info={code:200,msg:'success',data:{token:'xxxxx'}}
        //然后根据返回的数据做相应的处理,比如储存token
      
    } 
    },
    mounted(){
      //3. 执行登录
      this.login()
    }
  }
</script>

6.这样定义接口虽然看起来麻烦点,但有以下几个好处:

代码看起来规范,所有的接口都在一个文件夹定义,不用分散的各个组件,维护起来简单,例如后台的一些url变了,改起来也方便

可以做到接口一次定义,到处使用

例如首页使用了很多api

//index.js 首页的js文件
import {GET_USER_INFO} from 'apis/user_info.js' //用户信息
import {GET_CURRENT_INFO,GET_HOT_INFO} from 'apis/info.js' //热门资讯 最新资讯
import {GET_HOT_LECTRUE} from'apis/lectrue.js' //讲座推荐

用户界面也会用到用户信息api

//user_info.js用户信息页面
import {GET_USER_INFO} from 'apis/user_info.js' //用户信息

就先写到这里了,如有错误,请在评论区指正,下次整理下用户权限相关的内容,包括jwt,token保存和更新,页面权限问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery 表单取值赋值的一些基本操作
Oct 11 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
Apr 25 Javascript
js文件Cookie存取值示例代码
Feb 20 Javascript
javascript的数组和常用函数详解
May 09 Javascript
关于jQuery判断元素是否存在的问题示例探讨
Jul 21 Javascript
JavaScript获取IP获取的是IPV6 如何校验
Jun 12 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
Nov 25 Javascript
webpack 打包压缩js和css的方法示例
Mar 20 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
js中实例与对象的区别讲解
Jan 21 Javascript
详解Node.js使用token进行认证的简单示例
May 25 Javascript
详解如何在Javascript中使用Object.freeze()
Oct 18 Javascript
详解VUE单页应用骨架屏方案
Jan 17 #Javascript
Jquery获取radio选中值实例总结
Jan 17 #jQuery
js中call()和apply()改变指针问题的讲解
Jan 17 #Javascript
js中怎么判断两个字符串相等的实例
Jan 17 #Javascript
js中null与空字符串&quot;&quot;的区别讲解
Jan 17 #Javascript
vue中$nextTick的用法讲解
Jan 17 #Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 #Javascript
You might like
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
原生js实现轮播图
2017/02/27 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
python2.7的编码问题与解决方法
2016/10/04 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
python实现电子产品商店
2019/02/26 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
Python基于locals返回作用域字典
2020/10/17 Python
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
工商管理专业学生的自我评价
2013/10/01 职场文书
初中女生自我鉴定
2013/12/19 职场文书
大专毕业生求职信
2014/07/05 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
刑事辩护词范文
2015/05/21 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
正则表达式基础与常用验证表达式
2022/06/16 Javascript