前端接口多参数请求时如何优雅封装

接口多参数优雅封装

开发中经常会遇到有一个接口需要的query参数比较多, 参数的数据类型也不全是 string | number ,还存在数组或者其他类型的情况。

我以前的做法

因为是query参数,我以前的写法就是在接口地址上面进行字符串拼接。

ts 复制代码
 async function getJobList(
    clusterId: string,
    page: number,
    pageSize: number,
    JobName : string,
    JobStatus : string,
    Username : string,
    Queue : string,
    StartTime: string,
    EndTime: string
  ) {
    if (JobStatus == undefined) JobStatus = '';
    const res = await apiRequest.get(
      `/api/Cluster/${clusterId}/Job?page=${page}&pageSize=${pageSize}&JobName=${JobName}&JobStatus=${jobStatus}&Username=${Username}&Queue=${Queue}&StartTime=${
        StartTime ? StartTime : ''}&EndTime=${EndTime ? EndTime : ''}`
    );
    return res;
  }

以前觉得这样做没什么问题,就是写起来很不优雅,代码的可读性也特别差。

那能不能不安代码的格式化自己整理一下表呢?为方阅读这样去写

ts 复制代码
 const res = await apiRequest.get(
      `/api/Cluster/${clusterId}/Job?${page ? 'page=' + page : ''}
      ${pageSize ? '&pageSize=' + pageSize : ''}
      ${JobName ? '&JobName=' + JobName : ''}
      ${JobStatus ? JobStatus?.map((x) => '&JobStatus=' + x).join('') : ''}
      ${Username ? '&Username=' + Username : ''}
      ${Queue ? '&Queue=' + Queue : ''}
      ${StartTime ? '&StartTime=' + StartTime : '' }
      ${EndTime ? '&EndTime=' + EndTime : '' }`
    );

这种写法看起来更易读了,但是 ` 中的换行和空格会保留在里面,参数就会莫名的加上几个空格,查询参数就不对了(好心干坏事了)。

再说,如果参数更多呢,那岂不是要再去一个一个拼接,时间成本也太高了,有没有更优雅的写法呢?

解决办法

在MDN上看到了这个URLSearchParams接口

URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串。

通过URLSearchParams.append(name, value)方法可以不断往里面添加参数

下面是更改后的代码

ts 复制代码
 async function getJobList(
    clusterId: string,
    page: number,
    pageSize: number,
    JobName?: string,
    JobStatus?: Array<string>,
    Username?: string,
    Queue?: string,
    StartTime?: string,
    EndTime?: string
  ) {
    if (JobStatus?.length == 0) JobStatus = null;
    const add_params = {
      page: page,
      pageSize: pageSize,
      JobName: JobName,
      JobStatus: JobStatus,
      Username: Username,
      Queue: Queue,
      StartTime: StartTime,
      EndTime: EndTime,
    };
    const searchParams = new URLSearchParams();
    Object.keys(add_params).forEach((key) => {
      if ( add_params[key] !== undefined && add_params[key] !== null ) {
        const value = add_params[key];
        if (Array.isArray(value)) {
          value.forEach((item) => searchParams.append(key, item));
        } else {
          searchParams.append(key, value);
        }
      }
    });
    const res = await apiRequest.get(
      `/api/Cluster/${clusterId}/Job?${searchParams.toString()}`
    );
    return res;
  }

这样去写代码就整洁优雅了太多了

相关推荐
随风一样自由10 小时前
【前端独角兽】刚进入前端领域的前端开发用jQuery还是Vue3?
前端·javascript·vue3·jquery
IMPYLH11 小时前
HTML 的 <data> 元素
前端·html
YHHLAI11 小时前
[特殊字符] 面试中的 Promise —— 从入门到精通
前端·javascript·面试
weixin_BYSJ198712 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
沪飘大军12 小时前
ll-llm:一个零依赖、可插拔的 OpenAI 兼容 LLM 代理
javascript
kyriewen13 小时前
我扒了 GPT-5.6 的全部编程跑分——有一项 OpenAI 没敢放出来
前端·gpt·ai编程
前端H14 小时前
微前端 v3 架构升级:从加载隔离到状态协同
前端·架构·状态模式
山河木马14 小时前
GPU自动处理专题3-NDC怎么映射成屏幕像素坐标(视口变换)
javascript·webgl·图形学
陆枫Larry15 小时前
小程序包体积优化:用 SVG 图片替换 iconfont,并保留 CSS 控色能力
前端
Appthing15 小时前
在 TanStack Start 中使用 VitePWA 的正确配置
javascript