分享我在 vue 项目中关于 api 请求的一些实现及项目框架
本文主要简单分享以下四点
本文主要目的为以下三点
- 希望能够帮到一些人
- 希望能够得到一些建议
- 奉上一个使用Vue的模板框架
我只是把我觉得有用的东西分享出来罢了
使用 axios 请求接口
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
安装 axios
npm install axios --save
创建 axios 实例 (api/fetch.js)
axios 默认提交格式为:application/json
可使用 qs 模块(需要安装)转换后提交格式为 application/x-www-form-urlencoded
通过设置 transformRequest 属性 data => qs.stringify(data) 可以正常表单形式提交
import axios from 'axios'
const instance = axios.create({
baseURL: 'apiBaseUrl', // api的base_url
timeout: 10000 // 请求超时时间
// transformRequest: data => qs.stringify(data) //
})
// request拦截器
instance.interceptors.request.use(
e => {
e.params = e.params || {}
e.headers = e.headers || {}
//set 默认值
return e
},
error => ({ status: 0, msg: error.message })
)
// respone拦截器
instance.interceptors.response.use(
response => {
const resp = response.data
if (response.status === 200) {
return resp
}
return resp
},
error => {
console.log('err' + error) // for debug
return Promise.reject(error)
}
)
export default instance
使用封装的fetch.js
在 api 文件中新建接口模块并使用 axios 实例(api/fetch.js)
src/api/api_test.js
import request from '@/utils/fetch'
export function test(data) {
return request({
url: '/test',
method: 'post',
data: data
})
}
使用的时候,可通过引入 api/模块.js 调用方法,也可以通过安装插件的形式将 api 接口扩展到 vue 实例中,使其可以更方便的在项目中使用
以 test 模块为例创建一个$api 扩展
src/api/index.js
import * as api_test from './test'
const apiObj = {
api_test
}
const install = function(Vue) {
if (install.installed) return
install.installed = true
Object.defineProperties(Vue.prototype, {
$api: {
get() {
return apiObj
}
}
})
}
export default {
install
}
在 main.js 安装 $api 扩展:
import api from './api'
Vue.use(api)
在项目中调用:this.$api.api_test.test().then(resp=>{...}).catch(()=>{...})
在后端项目中我二次封装了下拉框,通过参数接收Function,传递$api.api_test.test省了可以少写很多代码。
关于开发环境和生成环境的配置读取
看到很多中做法,分享下我在项目中使怎么做的。
目前项目中的做法是在config文件夹中根据环境新建不同的配置,然后通过index.js暴露对应环境的配置。
目录结构及index.js
config
- _development.js
- _production.js
- _testing.js
config/index.js
module.exports = require('./_' + process.env.NODE_ENV).default
实际项目中的目录结构如下所示
关于在项目中使用 mock
看到好多项目把mock混在项目中使用,就感觉很难受,所以想办法独立出来了,功能不强大,只是足够用在一些小Demo上,简单模拟一下数据就可以让我们的Demo不用担心api接口失效导致vue项目跑不起来的问题。
下面是我的解决方案
express-mockjs 的使用
express-mockjs 是大佬结合
express+mock-lite构建的一个 api 服务中间件,用它可以快速的帮助我们在本地搭建一个 mock 服务器
相关资料:
安装 express-mockjs: npm install express-mockjs --save-dev
安装 nodemon 到项目 以监听 mock 代码修改
安装 nodemon: npm install nodemon --save-dev
新建 mock-server/index.js 编写启动服务器代码
var path = require('path')
var express = require('express')
var mockjs = require('express-mockjs')
var app = express()
// 自定义路径 前缀: '/api'
var config = {
port: 3000
}
//以/api为前缀,寻找api目录下的所有接口
app.use('/api', mockjs(path.join(__dirname, 'api')))
// 获取port参数 可通过 --port自 定义启动端口
var args = process.argv
for (let i = 0; i < args.length; i++) {
if (args[i] === '--port' && i < args.length - 1 && args[i + 1] > 0) {
config.port = args[i + 1]
break
}
}
console.log('mock-server[mockjs-lite]:http://localhost:' + config.port)
// console.log('mockjs-lite定义:http://mockjs-lite.js.org/docs/examples.html')
app.listen(config.port)
编写接口文件
在 mock-server 文件夹创建 api 文件夹,并按照 expess-mockjs 的文档编写 json/js
json
/**
* Interface function description
*
* @url /api-access-path
*/
{
"code": 0,
"result|5": [
{
"uid|+1": 1,
"name": "@name",
"email": "@email"
}
]
}
js
/**
* home page links
*
* @url /home-links
*
* Here you can write a detailed description
* of the parameters of the information.
*/
module.exports = {
code: function() {
// simulation error code, 1/10 probability of error code 1.
return Math.random() < 0.1 ? 1 : 0
},
'list|5-10': [{ title: '@title', link: '@url' }]
}
运行 mock 服务器
在项目的 package.json 中添加 mock 命令并运行:npm run mock
"scripts": {
//...
"mock": "nodemon --watch mock-server node mock-server/index.js --port 6543"
},
目录结构
开发环境根据上面的配置运行起来没问题了,但是如果自己的小Demo发布后要怎么才能使用呢?我的方法是将js文件生成json然后打包到dist目录
如果有兴趣可以参考mock-server/build.js
分享自己的项目框架
奉上一个以上实现都有的模板框架(UI使用Element-UI,为了好看),仓库中docs中有一些独立的一些说明有兴趣可以查看。
项目地址:https://github.com/yimogit/me-admin-template
预览地址:https://vue-admin.yimo.link/
效果图示:整容前 整容后
结语
感觉文章东西太多,什么都没讲清楚,不过,重要的是思路嘛,具体实现可以看框架代码~
如果文中有错误,欢迎指出。
如果有更好的实现方式,也希望有大佬指点一二。
分享我在 vue 项目中关于 api 请求的一些实现及项目框架的更多相关文章
- Fiddler无法抓取web项目中的http请求解决方案
问题:webform项目中对接API使用Fiddler无法获取该API的请求,该webform比较老的一个项目, 同一个API写在控制台可以抓取到请求,用web项目放在本地IIS却不行,使用IIS E ...
- Vue项目中的http请求统一管理
module.exports = { dev: { // Paths assetsSubDirectory: '/', assetsPublicPath: '/', proxyTable: { /op ...
- 如何在项目中封装api
一般在项目中,会有很多的api请求,无论在vue,angular,还是react中都应该把接口封装起来,方便后期的维护. 1.新建一个api文件 我们可以在项目的分目录下创建一个api文件夹,在这里面 ...
- Vue实例中封装api接口的思路 在页面中用async,await调用方法请求
一般我们写小型的项目是用不到封装axios实例 但是当我们写大型项目时 接口有时候多到有上百个接口,那我们在请求一次调用一次接口,接口上好多都是重复的,这个时候我们就可以封装axios实例,既节省了 ...
- 介绍vue项目中的axios请求(get和post)
一.先安装axios依赖,还有qs依赖 npm install axios --save npm install qs --save qs依赖包用post请求需要用到的 插入一个知识点: npm in ...
- vue2整个项目中,数据请求显示loading图
一般项目中,有时候会要求,你在数据请求的时候显示一张gif图片,然后数据加载完后,消失.这个,一般只需要在封装的axios中写入js事件即可.当然,我们首先需要在app.vue中,加入此图片.如下: ...
- vue2整个项目中,数据请求显示loading图----------未完成阅读,码
一般项目中,有时候会要求,你在数据请求的时候显示一张gif图片,然后数据加载完后,消失.这个,一般只需要在封装的axios中写入js事件即可.当然,我们首先需要在app.vue中,加入此图片.如下: ...
- 在.NET项目中使用PostSharp,使用CacheManager实现多种缓存框架的处理
在前面几篇随笔中,介绍了PostSharp的使用,以及整合MemoryCache,<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>.<在.NET项目中使用Pos ...
- SpringMVC,MyBatis项目中兼容Oracle和MySql的解决方案及其项目环境搭建配置、web项目中的单元测试写法、HttpClient调用post请求等案例
要搭建的项目的项目结构如下(使用的框架为:Spring.SpingMVC.MyBatis): 2.pom.xml中的配置如下(注意,本工程分为几个小的子工程,另外两个工程最终是jar包): 其中 ...
随机推荐
- python之可变长参数
参数组:*args,**kwargs 实参有按位置和按关键字两种形式定义,*args和**kwargs 位置参数:按照从左到右的顺序定义的参数 位置形参:必选参数 位置实参:按照位置给形参传值 关键字 ...
- MongoDB数据库(一):基本操作
1.NoSQL的概念 "NoSQL"一词最早于1998年被用于一个轻量级的关系数据库的名字 随着web2.0的快速发展,NoSQL概念在2009年被提了出来 NoSQL最常见的解释 ...
- Scyther-manual ------BNF
1.Scyther 协议安全模型的验证实例 第一部分: 打开协议模型 ,设置攻击变量的参数执行分析 Scyther is a tool for the formal analysis o the ...
- Docker动态给容器Container暴露端口
查看Container的IP地址 docker inspect <container name or id>| grep IPAddress 查看Container的映射的端口 docke ...
- Windows Internals 笔记——线程调度
1.线程内核对象中的CONTEXT反应了线程上一次执行时CPU寄存器的状态.大约每隔20ms,Windows都会查看所有当前存在的线程内核对象.Windows在可调度的线程内核对象中选择一个,并将上次 ...
- 使用docker 部署rabbitmq 镜像
1.使用带有web管理功能 sudo docker pull rabbitmq:management 2.运行镜像文件创建容器 sudo docker run -d --name rabbitmq - ...
- java 静态资源访问详解
一.java project项目 如果工程项目是java project的话获取资源文件 1.如果是在本工程根目录下直接访问 FileReader fr = new FileReader(" ...
- python第二十二天(面向对象)
1.面向过程编程: 核心就是过程两个字,过程是指解决问题的步骤,即先干什么后做什么. 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式 优点:复杂的问题流程化.进而简单化 缺点:可扩展 ...
- Excel—数学函数
ROUND(四舍五入函数)就是说把一个小数点后多位的数四舍五入小数点位数的函数 函数语法:ROUND(哪个数,要四舍五入到小数点后几位) ROUNDUP(保留小数点几位后进位的函数)就是说要保留一个小 ...
- 输入a,b,求a^b的所有因子之和
题目 poj的1845 分解a的质因数a=p1^t1*p2^t1........ 每个质因数对sum的贡献: 当除去质因数p1时的因数和为sum,当计入p1时,因子和变成sum*p1^0+sum*p1 ...