分享我在 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包): 其中 ...
随机推荐
- 明确MangoDB在企业中应用
目录 1.MongoDB是什么? 2.为什么要用MongoDB? 3.主要特性 4.C/S服务模型 5.完善的命令行工具 6.几个shell实操 7.在Java中使用MongoDB 明确MongoDB ...
- OpenStack—nova组件计算服务
nova介绍: Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. 用 ...
- 生产宕机dunp配置
修改线程数 <self-tuning-thread-pool-size-min>100</self-tuning-thread-pool-size-min> <self- ...
- loadrunner使用过程遇到的问题(一)
1.如果log日志出现乱码,如何设置?(对于乱码设置只是对单一脚本有效,并不是全部脚本有效,所以多个脚本出现乱码,需要逐个设置) loadrunner12版本设置方法,在preference里面,设置 ...
- .net core 部署在iis上
1. 启用iis (过程略) 参考操作流程 2. 下载并安装 .NET Core Windows Server Hosting 下载链接 下载完成后安装 3. 启动 windows process a ...
- IE下get方式传中文参数乱码解决方法
乱码原因:浏览器在传递url的时候,会使用自己的编码格式对地址进行编码,如果浏览器所使用编码与服务器采用编码不一致,服务器接收到的参数就会出现乱码.在firefox,chrome下正常,ie下会出现乱 ...
- ubuntu apt不使用代理
常见的问题是apt使用代理. 不过今天遇到的情况是,桌面进不去,只能tty:在tty界面下,发现1080端口上开着代理,/etc/environment和~/.bashrc中都确保注释掉了http_p ...
- [转]Example Design - Using the AXI DMA in polled mode to transfer data to memory
Description Attached to this Answer Record is an Example Design for using the AXI DMA in polled mode ...
- jackson json转bean忽略没有的字段 not marked as ignorable
@JsonIgnore注解用来忽略某些字段,可以用在Field或者Getter方法上,用在Setter方法时,和Filed效果一样.这个注解只能用在POJO存在的字段要忽略的情况,不能满足现在需要的情 ...
- 深入理解css优先级
为什么要写这篇文章是因为 <style type="text/css"> body h1 { color: green; } html h1 { color: purp ...