1.0.23 • Published 2 months ago

axios-api-query v1.0.23

Weekly downloads
3
License
ISC
Repository
github
Last release
2 months ago

axios-api-query

一个javascript通过api对象模型描述自动生成axios请求实例的插件

插件的设计初衷

我们在编写某个模块的业务代码时常常会将请求的具体代码也加入到其中,有些同学可能会将代码中所有的ajax请求或者某些模块中的ajax请求特定的抽出到某个js配置文件例如:user_ajax_config.js,如果直接写在代码中那么无形中使得我们的代码将变得异常臃肿而且 难以review,如果抽离出配置文件则需要在一个配置文件中定义n多的函数定义(这里我觉得定义每个函数的name将会特别的难受),而且针对于请求函数的通用设计和特殊设计也将会把配置文件的逻辑搞的一团糟。

插件的设计思想

api请求接口模型化,接口定义和执行分离

接口模型可以用配置文件构造例如:user.js用于存放所有user相关的请求描述

接口的描述可以让后端人员按照描述规则提前在接口管理系统里填写好

api请求中的繁琐的数据验证抽离成验证配置对象

构建配置抽离成npm包的意义

通用性
  1. 业务开发者无需关注构建配置
  2. 统一团队构建脚本
可维护性
  1. 构建配置合理的拆分
  2. README 文档、ChangeLog文档等
质量
  1. 冒烟测试、单元测试、测试覆盖率
  2. 持续集成

编辑器 1. Visual Studio Code

语言 1. javascript ES6

构建工具 1. "webpack": "^4.41.2" 2. "webpack-cli": "^3.3.9"

构建命令 1. npm run build

组件 1. "lodash": "^4.17.15", 2. "querystring": "^0.2.0", 3. "vdjs": "^1.0.0" 参数验证插件 4. "axios": "^0.18.0" (请使用这个版本,不要使用 npm i axios --save 安装最新的版本)

文档 1. https://www.lodashjs.com/docs/latest 2. https://www.cnblogs.com/pqjwyn/p/5824948.html 3. https://cnodejs.org/topic/59f0afd928137001719a821d

更新状态

版本时间
1.0.02020-02-26

库目录结构

未压缩版: loader-api.js
压缩版:loader-api.min.js

使用

使用npm

$ cnpm install axios-api-query -S

使用cdn

<script type="text/javascript" src="loader-api.min.js"></script>

本地使用

可以使用nginx之类的服务器把loader-api.min.js文件放到电脑的某个本地盘里(例如:D盘),然后在Webpack配置文件的plugins中使用html-webpack-externals-plugin这个插件已script标签的形式加载到html文件中。

const HtmlWebpackExternalsPlugin = require('html-webpack-externals-plugin')

module.exports = {
  plugins: [
      new HtmlWebpackExternalsPlugin({
        externals: [
          {
            module: 'axios',
            entry: 'https://cdn.bootcss.com/axios/0.18.0/axios.min.js',
            global: 'axios'
          }
          {
            module: 'LoaderApiLibrary',
            entry: 'http://127.0.0.1:8085/loader-api.min.js',
            // 这里的 global 之后会在 import 导入时使用
            // import LoaderApiLibrary from 'LoaderApiLibrary'
            global: 'LoaderApiLibrary'
          }
        ]
      })
  ]
}

axios库

注意:axios库在插件中使用html-webpack-externals-plugin插件进行了分离所以需要在自己项目中的index.html中使用cdn的形式进行导入。

(如果配置了html-webpack-externals-plugin就不需要手动引入了)

<script type="text/javascript" src="https://cdn.bootcss.com/axios/0.18.0/axios.min.js"></script>

vdjs 验证库

npm i vdjs@1.0.0 -S

querystring

npm i querystring@0.2.0 -S

示例:

验证规则介绍:https://cnodejs.org/topic/59f0afd928137001719a821d

// 导入插件
(npm 安装的形式,如果是通过`html-webpack-externals-plugin`加载的请用自己配置的`global`名称值)
import LoaderApiLibrary from 'axios-api-query'

// 构建user接口描述模型
// 静态描述建议不要将动态参数设置在模型中,以免影响模型的表述
let user = [
    {
      name: 'getUserInfo',
      desc: '获取某个用户的信息',
      method: 'GET',
      path: 'root/login/{id}/getUserInfo',
      mockPath: 'mock/root/login/{id}/getUserInfo',
      mock: false, // 是否使用mock地址
      cache: false, // 不是用缓存
      removeInvalidChar: true,
      params: { type: '', token: 'test'}, // 拼接在URL后面的参数
      data: {name: '小明', love: '睡觉'}, // 这里是GET请求data参数主要是针对于POST、PUT
      restful: { id: 1 }, // 将自动替换{id}为1 root/login/1/getUserInfo
      validator: {
          type: [{ sqlXss: true, not: '', msg: '类型不能为空!'}],
          token: {not: '', msg: 'token不能为空!'}
      }, // params、data参数验证对象,这里也省略了业务代码中繁琐的验证操作
      restfulValidator: {
          id: {not: '', msg: 'id参数不能为空'}
      }, // restful参数验证对象,这里也省略了业务代码中繁琐的验证操作
      responseType: 'json',
      proxy: null // 如果接口需要代理可以在这里设置
    }
  ]
// 初始化
// 传入api模型对象集合,api构建全局参数,axios实例参数
const Loader = new loaderApiLibrary({'user': user},{
    console_request_enable: true,
    console_response_enable: false,
    request_error_callback: function({status, statusText}){
        //  请求出现异常并且被拦截器成功捕获到 例如:404
    }
},{
    timeout: 30000,
    transformResponse: function(data = {}){
        // 修改响应数据
        return data
    })
})
// 全局钩子函数
window.apiRequestStartHandler = function(){
	console.info('请求开始发送');
}
window.apiRequestEndHandler = function(){
	console.info('请求结束');
}
window.apiRequestInterceptErrorHandler = function(message){
	// 请求出现拦截器无法捕获的异常 例如:timeout请求超时
}
// 执行请求
// 函数入参可以覆盖接口描述中的参数
let bb = '100'
Loader.api['user/getUserInfo']({params: {token: 'test_1', id: 1001}, restful: {id: 11}, headers: {}, data: {}}, {
    request_error_callback: function({status, statusText}){
        //某个请求的特定异常提示
    },
    // 只会覆盖模型中的type验证规则
    validator: {
		type: {eq: bb, msg: 'type必须是100'}
	},
	restfulValidator: {
		id: {eq: 123, msg: '必须是12345'}
	},
	transformResponse: function(data = {}){
	    // 某个具体请求执行过滤数据,会覆盖全局过滤函数
	    return data
	})
}).then((response)=>{
    // 请求成功
}).catch((error)=>{
    // 请求失败
})

执行多个并发请求

Loader.allApi([Loader.api['user/get']({params: {token: 'czdg_app'}, data: {name: '123'}}), Loader.api['modules/get']()]).then((data = [])=>{
    // 请求都成功
    console.info('成功',data);
  }).catch((error)=>{
	console.info('失败',error);
  })

如果把loader-api.min.js插件直接放在工程目录的某个文件夹下,可以这么来使用:

(访问的请求代理我们可以在 webpackDevServer中设置proxy参数)

import LoaderApiLibrary from './utils/loader-api.min.js'

let user = [{
  name: 'getUserInfo',
  desc: '获取某个用户的信息',
  method: 'GET',
  path: '/combobox_data1.json',
  mockPath: '/combobox_data1.json',
  mock: false, // 是否使用mock地址
  cache: false, // 不是用缓存
  removeInvalidChar: true,
  params: { token: 'test' }
}]
const Loader = new LoaderApiLibrary({ 'user': user });

Object.defineProperty(Vue.prototype, '$api', { value: Loader.api })
/* Vue.prototype.$api = Loader.api
Vue.prototype.$api['user/getUserInfo']().then((data) => {
  console.info(data);
}) */

类: Loader

构造器 Constructor

new LoaderApiLibrary(userApiConfigModuleList, userApiConfigopt, userAxiosConfigopt)

构造函数接收3个参数,第一个参数为必填,第二和三可选

参数:

参数类型属性默认值描述
userApiConfigModuleListObject必填{}api接口模型配置对象集合
userApiConfigObject可选{}api接口模型配置参数
userAxiosConfigObject可选{}axios实例配置参数

示例

userApiConfigModuleList

{'goods': [{'read':{'name':'',desc: ''}, 'get': {}}]}

userApiConfig

{'mockBasePath': 'mock/test/goods/read', 'mock': true}

userAxiosConfig

{'timeout': 15000, 'baseURL': 'test/goods/read'}

api接口模型配置参数

参数类型属性默认值描述
namestring必填接口名称==不可中文==
methodstring可选GET请求类型 GET、PUT、POST、DELETE、HEADER
descstring可选接口描述
baseURLstring可选访问url目录(可以是相对 URL)
pathstring必填请求接口路径 root/user/getUserInfo
mockPathstring必填mock请求接口路径 mock/root/user/getUserInfo
mockboolean可选false是否打开mock操作
cacheboolean可选false是否打开cache (false URL后有随机字符参数 trur没有)附录③
removeInvalidCharboolean可选true是否执行参数特殊字符过滤
restfulobject可选restful参数(==如果url类似:/root/user/{id}/get 则此参数需要设置id的值 {id: 2}==)
headersobject可选请求首部字段参数
paramsobject可选待发送 Key/value 参数,如果没有在这里定义某个参数接口执行时多传入参数将不能设置到请求中(==会接在URL地址后==)
dataobject可选POST请求,待发送 Key/value 参数
validatorobject可选params和data参数验证对象
restfulValidatorobject可选restful参数验证对象
responseTypestring可选'json'服务器响应的数据类型
proxyobject可选定义代理服务器的主机名称和端口

api接口模型配置参数 userApiConfig

参数类型默认值描述
mockBasePathstringmock-url请求地址(可以是相对 URL), 应该外部传入
mockbooleanfalsemock全局控制开关(如果设置为true所有api的请求URL路径将变成mockBasePath)
gParamsObject{}URL全局自定义参数,每个请求最后都会带上这个不可变的参数(例如:URL?code=app)
cachebooleanfalse缓存控制开关在URL路径后面添加一个时间戳参数 _=1571825001570 附录③
seqstring/api接口命名空间分隔符 (Loader.api'user/get')
invalidCharstring附录①进行特殊字符过滤的规则
statusMessageObject附录②前端response返回状态码提示短语
console_request_enablebooleanfalse开启请求参数打印
console_response_enablebooleanfalse开启响应参数打印
request_error_callbackfunctionnull请求错误回调函数

axios实例配置参数 userAxiosConfig

参考:http://www.axios-js.com/zh-cn/docs/

参数类型默认值描述
timeoutnumber15000超时时间(毫秒)
baseURLstring访问url目录(可以是相对 URL), 应该外部传入
maxContentLengthnumber2000定义允许的响应内容的最大尺寸(字节数)
statusnumber200来自服务器响应的 HTTP 访问处理成功状态码
statusTextstring'OK'来自服务器响应的 HTTP 访问处理成功状态信息短语
transformResponsearray[]全局预处理过滤函数,可以在then之前进行过滤
headersObject{'Content-Type': 'application/json;charset=UTF-8'}请求首部字段
defaultsObject{}配置的默认值
responseTypestring'json'服务器响应的数据类型
proxyObject{}定义代理服务器的主机名称和端口

全局拦截钩子函数

名称作用域回参描述
apiRequestStartHandlerwindow监听请求的发送
apiRequestEndHandlerwindow监听请求成功结束
apiRequestInterceptErrorHandlerwindow错误描述Error对象监听请求异常-==无法捕获的异常例如:timeout请求超时==

程序运行错误号描述

错误号描述
01构造函数中传递的参数必须是普通Object对象
02api接口描述 name、path或者mockPath必须要设置

附录:

[`~!@#$^&*()=|{}\':;\',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“\'。,、?]

{
    400: '错误请求',
    404: '找不到请求地址',
    405: '方法不被允许',
    500: '内部错误',
    502: '错误网关',
    503: '无法获得服务'
  }

http网络请求获取资源时附加在URL后面的额外的query参数,作为浏览器或者服务器未正确配置时的“cache bust”手段很有用。 使用“cache bust”配置的一个示例: javascripts;urlArgs: "bust="+(new date()).getTime() 在开发中这很有用,但请记得在部署到生产环境之前移除它。

作者:atrpo980

1.0.23

2 months ago

1.0.22

4 months ago

1.0.22-beta.1

4 months ago

1.0.19

6 months ago

1.0.19-beta.1

6 months ago

1.0.21

6 months ago

1.0.20

6 months ago

1.0.18

1 year ago

1.0.17

3 years ago

1.0.16

3 years ago

1.0.15

4 years ago

1.0.14

4 years ago

1.0.13

4 years ago

1.0.12

4 years ago

1.0.11

4 years ago

1.0.10

4 years ago

1.0.9

4 years ago

1.0.8

4 years ago

1.0.7

4 years ago

1.0.6

4 years ago

1.0.5

4 years ago

1.0.4

4 years ago

1.0.3

4 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago