利用jsonpath封装前端接口的技巧与实践

作者:墨池

时间:2026-10-27

浏览:368

本文介绍如何利用jsonpath库对前端接口进行封装,旨在构建易维护、高扩展性的API结构。通过统一封装axios并定义清晰的接口JSON文档,开发者只需传入topic即可获取完整URL及参数,简化了请求调用流程,提升了代码可读性与可维护性。

文章目录

引言

jsonpath是一款能够依据用户定义规则,在复杂JSON结构中定位特定数据的工具库。

本文通过jsonpath实现接口封装,目标是构建一个对前端友好、易于维护、具备高扩展性及良好可读性的API JSON结构。

若您熟悉xPath,则能轻松上手jsonpath;若未接触过,可通过本节快速了解。代码写法非固定模式,此处仅展示思路。

jsonpath快速入门

let obj = {...}
let queryData = jsonpath.query(obj,"$..[?(@.name=='ni')]")

上述语法的含义如下:

$:表示从根元素开始,即`$.`,随后的`.`代表递归查询,即深入查询至最末级子节点。

[?()]:条件过滤语句,其中`@.`指代当前节点,可类比为`for...of`循环中的当前项(item)。

如示例所示,jsonpath最核心的query方法包含两个参数:第一个为数据源,第二个为查询表达式。

此外,jsonpath还提供nodes和paths用于查询键值路径,以及value用于查询具体值等方法。

利用jsonpath进行API封装

封装axios库

在封装axios的过程中并未直接使用jsonpath,此处仅对方法进行了统一化处理。

以封装GET请求为例:

import getUrl from "./apis"  // 这个就是你自己写的接口json,下面会讲
get(topic, data) {
    let url
    if (topic.indexOf('http') === 0 || topic.indexOf('https') === 0) {
      url = topic
    } else {
      url = getUrl(topic)
    }
    return new Promise((resolve, reject) => {
      axios.get(url, {
        params: data
      })
        .then(response => {
          resolve(response.data)
        }, err => {
          reject(err)
        })
    })
  },

我们需要传入一个topic(主题标识)和一个data(请求参数)。

data需根据HTTP方法的不同进行差异化处理,例如在POST函数中应直接调用axios.post(api(topic), data),而非沿用上述语法。

topic的作用在于从API配置中检索对应的URL,后续将详细阐述,此步骤由jsonpath实现。

axios部分的封装至此完成,相信各位开发者也有各自的封装方案,大体思路相似,您完全可以保留自己的axios封装方式。

封装API配置

我们始终追求一种易于管理和使用的API封装方案,借助jsonpath可轻松实现。我们可以编写仅面向人类阅读的API文档,无需过度担忧格式是否易于机器读取。

例如,我们可以将api.js配置如下:

const apis = {
mainDomain: {
    baseUrl: "https://yourmainDomain.com",
    uri: {
      introduction: {
        topic: "introduction",
        uri: "/introduction",
        pramas: {
          appCode: String,
          type: Number
        }
      },
      someData: {
        topic: "someData",
        uri: "/somepath/somewhere/someData",
      },
     }
 },
 other:{...}
}

从上述结构可见,我们将API以“域名>uri+参数”的形式组织为一个大对象,类似于编写文档。这种格式的数据极利于开发人员阅读,能清晰知晓每个接口的主机来源及参数定义。如有需要,可添加method字段以明确请求方法。总之,可通过增加字段维护文档,直至包含所需全部信息且易于理解。

若不使用jsonpath,我们可能需要编写较复杂的遍历逻辑来提取完整的接口地址。

而基于上述结构,利用jsonpath可轻松确定接口的完整地址及其所需参数。

const getUrl = (topic) => {
  let path = jsonpath.paths(apis, `$..[?(@.topic=='${topic}')]`)
  let { baseUrl } = jsonpath.query(apis, `$.${path[0][1]}`)[0]
  let { uri } = jsonpath.query(apis, `$..[?(@.topic=='${topic}')]`)[0]
  return baseUrl + uri //返回完整api地址
}
export default getUrl //这里就是暴露刚刚用到的方法

只需传入一个topic,即可根据该标识检索出完整地址。topic可取自接口地址的某字段,或直接取与根接口功能高度相关的字符。例如,对于用户信息接口,我们将topic设为getUserInfo,无论接口实际形态如何,调用时仅需:

let userInfo = await request.get('getUserInfo')

基于上述思路,我们需要执行以下步骤:

  • 根据个人偏好封装axios
  • 根据个人偏好编写接口JSON配置
  • 根据编写的JSON配置编写jsonpath查询语句

完成上述三步后,即可投入使用。

通常我们将请求逻辑与接口JSON分离,假设定义request.js和api.js两个文件。

在request中引入api.js的getUrl方法,用于解析开发者传入的topic,并返回一个axios的Promise对象。我们将各类方法封装在大对象中,例如:

import axios from "axios"
import api from "./apis"
import qs from "qs"
const request = {
  //...post...get......
}
function getCookie(cname) {
  var name = cname + "=";
  var ca = document.cookie.split(';');
  for (var i = 0; i < ca.length; i++) {
    var c = ca[i].trim();
    if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
  }
  return "";
}
export default request

如此,便完成了全部的封装流程。

最终效果展示

实际使用感受如下:

import request from '@/utils/request';
let bugsData = await request.get('getBugsData', {
    beginTimeS: time.begin,
    endTimeS: time.end
})
let bugsData = await request.post('setUserInfo', {
    nickName: "德莱厄斯",
})
let bugsData = await request.put('someApi', {
    someKey: "someValue",
})

可见,采用此方法封装后,调用时仅需传入一个字符串和一个代表参数的对象。由于在封装axios时已对参数格式做了统一处理,无论调用GET还是POST,均只需遵循单一格式编写请求即可。

在此封装模式下,扩展性极强,您可根据个人喜好添加各类拦截器。

以上即为利用jsonpath进行接口封装的技巧详解,更多jsonpath接口封装相关内容请关注本站其他文章!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章