npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

x-axios-helper

v1.0.0

Published

基于axios扩展的异步请求插件,为前端实现API统一管理的解决方案。

Downloads

3

Readme

x-axios-helper

基于axios扩展的异步请求插件,为前端实现API统一管理的解决方案。。

安装

npm install x-axios-helper --save

注册

在应用入口文件,通过apiHelper进行初始化,使用方式如:

import axiosHelper from 'x-axios-helper'

axiosHelper.register({
  systemConfig: {
    // globalAxiosOptions配置与axios配置一致,axios配置参考axios配置一节
    globalAxiosOptions: {
      baseURL: 'https://some-domain.com/api/',
      ...
    },
    // 系统API配置信息
    api: [{
      name: '通用查询接口',
      method: 'queryData',
      url: '/api/v1/basic/queryData'
    }, {
      name: '通用查询分页接口',
      method: 'pagingData',
      url: '/api/v1/basic/pagingData',
      type: 'get'
    }, {
      name: '通用新增接口',
      method: 'add',
      url: '/api/v1/basic/execute',
      type: 'post',
      /*静态参数*/
      data:{
        lcontent:'测试数据' //请求体参数
      },
      params:{
        key:'i_s_sys_log'// url参数
      }
    }, {
      name: '路径参数型接口',
      method: 'getUser',
      url: '/api/v1/getUser/{id}'
    }]
  },

  // 请求拦截器
  requestIntercept(config){
    // 自定义处理逻辑
    return config
  },

  // 响应拦截器
  responseSuccIntercept(resp){
    // 自定义处理逻辑
    return resp
  },

  // 响应异常拦截器
  responseErrorIntercept(err){
    // 自定义处理逻辑
  }
).then(() => {
  // 后续逻辑,如启动应用
})

如果要禁用默认的请求拦截器、响应拦截器、响应异常拦截器逻辑,则传入null即可,如下:

import axiosHelper from 'x-axios-helper'

axiosHelper.register({
  ...
  requestIntercept: null,
  responseSuccIntercept: null,
  responseErrorIntercept: null
}).then(() => {
  ...
})

最佳实践

1、将API的配置按模块分别配置,然后统一在一个文件中进行导出 2、在注册异步请求插件的地方,将API配置文件引入进行注册,如:

├── src
│   ├── api.js // 接口配置文件
│   ├── main.js

api.js文件内容,如下:

export default
[{
  name: '通用查询接口',
  method: 'queryData',
  url: '/api/v1/basic/queryData'
}, {
  name: '通用查询分页接口',
  method: 'pagingData',
  url: '/api/v1/basic/pagingData',
  type: 'get'
}, {
  name: '通用新增接口',
  method: 'add',
  url: '/api/v1/basic/execute',
  type: 'post',
  /*静态参数*/
  data:{
    lcontent:'测试数据' //请求体参数
  },
  params:{
    key:'i_s_sys_log'// url参数
  }
}, {
  name: '路径参数型接口',
  method: 'getUser',
  url: '/api/v1/getUser/{id}'
}]

在入口文件main.js文件中

import apiConfig from './api'
import axiosHelper from 'x-axios-helper'

axiosHelper.register({
  systemConfig: {
    ...
    api: apiConfig
  },
  ...
).then(() => {
  ...
})

使用方式

注册后,通过全局变量$api(注册到window对象上)来调用。

配置型接口请求

在注册的地方需要将api配置传入,比如根据以上传入的API配置信息,就可以使用以下方式调用:

// 使用方式
$api.queryData({
  // 与axios配置一致
  params: {
    key: 's_sys_menu_list',
    page_id: 90,
    user_id: 0
  }
}).then((resp) => {
  console.log(resp)
}).catch(err => {
  console.log(err)
}).finally(() => {
  console.log('done')
})

$api.pagingData({}).then().catch().finally()

restful请求

在配置型接口基础上,会默认扩展一种路径参数型请求,通过对应方法的restful方法发起请求,并将匹配到的params参数替换到url路径上,未匹配到的参数拼接到url参数上,比如获取用户接口注册为:

[{
  name: '路径参数型接口',
  method: 'getUser',
  url: '/api/v1/getUser/{id}'
}]

则可发起以下调用:

// 使用方式
$api.getUser.restful({
  // 与axios配置一致
  params: {
    id: 1,
    age: 18
  }
}).then((resp) => {
  console.log(resp)
}).catch(err => {
  console.log(err)
}).finally(() => {
  console.log('done')
})

最终发起的请求为:/api/v1/getUser/1?age=18,以满足后端接口通过路径来接收参数的场景。

语义化请求

// Get请求
$api.get({
  // 与axios配置一致
  url: '/api/v2/basic/data',
  params: {
    key: 's_sys_menu_list',
    page_id: 90,
    user_id:0
  }
}).then(resp => {
  console.log(resp)
}).catch(err=>{
  console.log(err)
}).finally(() => {
  console.log('done')
})

// Post请求
$api.post({}).then().catch().finally()
// Delete请求
$api.delete({}).then().catch().finally()
// Put请求
$api.put({}).then().catch().finally()

链式请求

当一个接口需要另一个接口的返回值时,则链式请求就可以派上用场,使用方式如下:

$api.queryData({
  params: {
    key: 'select_sys_menu_list',
    page_id: 90,
    user_id: 0
  }
}).then(resp => {
  // resp即第一个接口返回的结果
  return $api.pagingData({
    params: {
      key: 'i_s_sys_log',
    }
  })
}).then(resp => {
  // resp即第二个接口返回的结果
  return $api.add({
    data: {
      menu:resp.data.data,
      lcontent: '页面访问量'
    }
  })
}).then(resp => {
  console.log(resp)
})

并发请求

const request1 = () => {
  return $api.add({
    params: {
      key: 'i_s_sys_log'
    },
    data: {
      lcontent: '页面访问量'
    }
  })
}
const request2 = () => {
  return $api.queryData({
    params: {
      key: 's_sys_menu_list',
      page_id: 90,
      user_id: 0
    }
  })
}

$api([request1, request2]).then(([resp1,resp2]) => {
  // 多个请求都完成时,才会调用then的回调
  // resp1即request1的响应结果,resp2即request2的响应结果,顺序与传入的请求顺序保持一致
  console.log(resp1)
  console.log(resp2)
})

取消请求

// 取消所有发起的请求
$api.cancel()

//取消指定的请求
$api.get({
  name:'s_sys_user_list',
  ...
}
}).then()
//发起请求的时候,指定name属性,取消请求的时候,就用name属性值来取消请求
$api.cancel('s_sys_user_list')

//第二个参数作为提示信息显示在控制台
$api.cancel('s_sys_user_list','取消了用户接口的请求')

上传文件

const formData = new FormData()
formData.append('userfile', fileInputElement.files[0])
$api({
  // 与axios配置一致,会合并全局配置参数globalAxiosOptions
  method: 'post',
  url: '/api/v1/file/upload',
  // 请求体方式传参
  data: formData
}).then(resp => {
  // 请求成功,执行then的回调
  console.log(resp)
}).catch(err => {
  // 请求发生异常时,你可以在catch的回调里处理
  console.log(err)
}).finally(() => {
  // 无论请求是否成功,都会执行finally的回调
  console.log('done')
})

token机制

实现思路:在注册插件时,注册请求拦截器和响应异常拦截器,在请求拦截器里给请求头设置token,在响应异常拦截器里处理token过期时的逻辑

import axiosHelper from 'x-axios-helper'

axiosHelper.register({
  ...
  // 请求拦截器
  requestIntercept(config){
    config.headers['Authorization'] = `Bearer token值`
    return config
  },

  // 响应异常拦截器
  responseErrorIntercept(err){
    if (error.response.status === 401) {
      // token过期,自动跳到登录路由
    }
  }
).then(() => {
  ...
})

附:官方axios完整配置参考

{
  // `url` 是用于请求的服务器 URL
  url: '/user',

  // `method` 是创建请求时使用的方法
  method: 'get', // 默认是 get

  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  baseURL: 'https://some-domain.com/api/',

  // `transformRequest` 允许在向服务器发送前,修改请求数据
  // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
  transformRequest: [function (data) {
    // 对 data 进行任意转换处理

    return data;
  }],

  // `transformResponse` 在传递给 then/catch 前,允许修改响应数据
  transformResponse: [function (data) {
    // 对 data 进行任意转换处理

    return data;
  }],

  // `headers` 是即将被发送的自定义请求头
  headers: {'X-Requested-With': 'XMLHttpRequest'},

  // `params` 是即将与请求一起发送的 URL 参数
  // 必须是一个无格式对象(plain object)或 URLSearchParams 对象
  params: {
    ID: 12345
  },

  // `paramsSerializer` 是一个负责 `params` 序列化的函数
  // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
  paramsSerializer: function(params) {
    return Qs.stringify(params, {arrayFormat: 'brackets'})
  },

  // `data` 是作为请求主体被发送的数据
  // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
  // 在没有设置 `transformRequest` 时,必须是以下类型之一:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - 浏览器专属:FormData, File, Blob
  // - Node 专属: Stream
  data: {
    firstName: 'Fred'
  },

  // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
  // 如果请求话费了超过 `timeout` 的时间,请求将被中断
  timeout: 1000,

  // `withCredentials` 表示跨域请求时是否需要使用凭证
  withCredentials: false, // 默认的

  // `adapter` 允许自定义处理请求,以使测试更轻松
  // 返回一个 promise 并应用一个有效的响应 (查阅 [response docs](#response-api)).
  adapter: function (config) {
    /* ... */
  },

  // `auth` 表示应该使用 HTTP 基础验证,并提供凭据
  // 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头
  auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },

  // `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
  responseType: 'json', // 默认的

  // `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称
  xsrfCookieName: 'XSRF-TOKEN', // default

  // `xsrfHeaderName` 是承载 xsrf token 的值的 HTTP 头的名称
  xsrfHeaderName: 'X-XSRF-TOKEN', // 默认的

  // `onUploadProgress` 允许为上传处理进度事件
  onUploadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },

  // `onDownloadProgress` 允许为下载处理进度事件
  onDownloadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },

  // `maxContentLength` 定义允许的响应内容的最大尺寸
  maxContentLength: 2000,

  // `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte
  validateStatus: function (status) {
    return status >= 200 && status < 300; // 默认的
  },

  // `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目
  // 如果设置为0,将不会 follow 任何重定向
  maxRedirects: 5, // 默认的

  // `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:
  // `keepAlive` 默认没有启用
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),

  // 'proxy' 定义代理服务器的主机名称和端口
  // `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据
  // 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。
  proxy: {
    host: '127.0.0.1',
    port: 9000,
    auth: : {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },

  // `cancelToken` 指定用于取消请求的 cancel token
  // (查看后面的 Cancellation 这节了解更多)
  cancelToken: new CancelToken(function (cancel) {
  })
}

更新日志

  • 1.0.0 版本发布