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

接口多参数优雅封装

开发中经常会遇到有一个接口需要的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;
  }

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

相关推荐
贩卖纯净水.5 分钟前
Chrome调试工具(查看CSS属性)
前端·chrome
栈老师不回家1 小时前
Vue 计算属性和监听器
前端·javascript·vue.js
前端啊龙1 小时前
用vue3封装丶高仿element-plus里面的日期联级选择器,日期选择器
前端·javascript·vue.js
一颗松鼠1 小时前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript
小远yyds1 小时前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js
阿伟来咯~2 小时前
记录学习react的一些内容
javascript·学习·react.js
吕彬-前端2 小时前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱2 小时前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai3 小时前
uniapp
前端·javascript·vue.js·uni-app
也无晴也无风雨3 小时前
在JS中, 0 == [0] 吗
开发语言·javascript