关于接口设计的思考–我们真的需要这么多入参吗

最近,我改造一个旧接口时发现,这个接口有 30 多个入参,而事实上并不需要那么多,而且,这个接口还存在比较大的安全隐患。所以,关于如何设计接口入参,我想谈谈自己的一些想法。

当然,只是一家之言,不一定就是对的。

我改造的这个接口主要用来保存单据,单据由商场下单员录入(商场为加盟商,接口非内网专用),单据内容包括:客户(谁)、门店(在哪里)、服务时间(什么时候)、服务内容(做了什么事)等等。

单据的表设计大致如下。通过对应的 id 关联了商场、门店和客户,并且冗余了部分字段。这里暂且不讨论表设计的合理性。

字段 描述 id 主键 org_id 商场id org_no 商场编码 shop_id 门店id shop_no 门店编码 customer_id 客户id customer_name 客户名 customer_tel 客户电话 ······ 省略

前端页面大致是这样的。 商场、门店和客户等信息都是选出来的,而不可以手动编辑。门店是商场的下级,它们的关系有点像部门和科室,所以,当我选择了门店后,商场自然地也带出来了。

那么,针对这个接口,我们该如何设计入参呢?

旧接口的设计非常直接,数据库表需要什么字段,前端就传什么字段。

public class ServiceInfoDTO {
    @NotBlank
    private String orgId;
    @NotBlank
    private String orgNo;
    @NotBlank
    private String shopId;
    @NotBlank
    private String shopNo;
    @NotBlank
    private String customerId;
    @NotBlank
    private String customerName;
    @NotBlank
    private String customerTel;
    // ······
}

这个接口把数据的组装逻辑全部丢给了前端,而后端几乎什么都不需要做,只要把前端的数据直接入库就行。因为什么都不需要做,性能肯定很好。还有,这个接口上线至今,暂未出现 bug。

那么,它就算是一个好接口了吗?

我认为不是,因为 这个接口太过信任调用方,即使我随便入一个商场 id,数据照样可以入库。而且,不应该把逻辑都放在前端,也并不需要那么多的入参。

我也很好奇一点,设计出这样的接口,前端竟然没有意见。

我的改造是这样的:

首先,解决入参过多的问题,思路就是将数据组装逻辑转移到后端。在这个接口中,字段间是存在关联关系的,例如,有了门店 id,我们就可以拿到门店编码、商场 id、商场编码,客户信息也是同理。所以,我是否可以将入参更改成这样:

public class ServiceInfoDTO {
    // @NotBlank
    // private String orgId;
    // @NotBlank
    // private String orgNo;
    @NotBlank
    private String shopId;
    // @NotBlank
    // private String shopNo;
    @NotBlank
    private String customerId;
    // @NotBlank
    // private String customerName;
    // @NotBlank
    // private String customerTel;
    // ······
}

接着解决安全问题。我需要增加校验,例如,当前下单员能不能选到传进来的门店和客户,等等。

通过改造,这个接口性能上不如旧接口,但更加安全。

我还遇到过其他类似的接口。例如,查询”我的客户”的接口让前端传创建人 id 进行过滤,后端不做条件设置和校验,直接将条件转为 sql 查询数据库,查询”商场的客户”时则让前端传商场 id 进行过滤。你觉得合理吗?

Original: https://www.cnblogs.com/ZhangZiSheng001/p/14968393.html
Author: 子月生
Title: 关于接口设计的思考–我们真的需要这么多入参吗

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610440/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • quartz框架(七)-JobStore

    在之前的博文中,博主已经写了关于Job的相关内容。本篇博文,博主将介绍JobStore相关的内容。 JobStore是存放Job和Trigger的地方。当我们调用Scheduler…

    Java 2023年6月7日
    072
  • java几种常见的排序

    排序,就是将一串数组(一个列表)中的元素(整数,数字,字符串等)按某种顺序(增大,减小,字典顺序等)重新排列。 下面介绍几种排序 1.冒泡排序 定义:冒泡排序就是从第一个元素开始,…

    Java 2023年6月8日
    082
  • 6.824 Spring 2020 feb14 Lab1MapReduce 笔记

    简介 这个实验要求我们使用 golang 自行实现一个支持并发和简单容错的 分布式 MR ,支持一个 master 多个 wokrer 的工作模式。 我做完实验之后去看了一下之前网…

    Java 2023年5月29日
    060
  • java RSA生成公钥和私钥

    1.随机生成密钥对 /** * 随机生成密钥对 * @throws NoSuchAlgorithmException */ public static void genKeyPai…

    Java 2023年6月16日
    0104
  • SpringMVC、Spring、MyBatis整合(IDEA版)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月5日
    0113
  • 介绍几个好用的Java库

    这些库主要方便开发,比如简化集合的使用等 1)commons-collections4 csharp;gutter:true; org.apache.commons commons…

    Java 2023年5月29日
    070
  • MySQL里的那些日志们

    该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sq…

    Java 2023年6月7日
    064
  • SpringBoot中Tomcat和SpringMVC整合源码分析

    概述 ​ SpringBoot中集成官方的第三方组件是通过在POM文件中添加组件的starter的Maven依赖来完成的。添加相关的Maven依赖之后,会引入具体的jar包,在Sp…

    Java 2023年6月13日
    097
  • 国产时序数据库IotDB安装、与SpringBoot集成

    一.简介: 本文将完成一个真实业务中的设备上报数据的一个例子,完整的展示后台服务接收到设备上报的数据后,将数据添加到时序数据库,并且将数据查询出来的一个例子。本文所有代码已经上传G…

    Java 2023年6月13日
    0144
  • 理解Java FutureTask

    FutureTask实现的功能 它的功能就像他继承的接口一样:Runnable与Future。他实现了一套机制将两者连接起来。Runnable主要方法是run(),用于执行一些程序…

    Java 2023年5月29日
    086
  • java中synchronized关键字

    synchronized是java中的一个关键字,在中文中为同步,也被称之为’同步锁’,以此来达到多线程并发访问时候的并发安全问题,可以用来修饰代码块、非静…

    Java 2023年6月8日
    084
  • 点赞和取消点赞实现Redis缓存(只思路)

    思路:点赞、取消点赞 ——> Redis ——> (每两个小时)存到数据库(MySQL),所以就相当于每次查询或者存储都需要先经过Redis,而查询的目的是为了判断用户…

    Java 2023年6月7日
    075
  • 关于系统权限的设计-位操作

    本文讨论是权限设计的其中一种思路,有它自己的优缺点,不一定适用于所有系统。 一、Linux文件权限 大家都知道,Linux上有三种文件权限: r:表示读取,对应的数字为 4; w:…

    Java 2023年6月9日
    095
  • 20220930-ArrayList扩容机制源码分析②

    本部分对于使用设置初始容量的方法创建ArrayList集合的方式进行源码分析。 public class ArrayListSource { public static void …

    Java 2023年6月15日
    074
  • xxl-job执行器的注册

    一、执行器注册流程 二、具体流程 1.注册监控线程 //类:JobRegistryHelper.java;&amp…

    Java 2023年6月16日
    093
  • spring 事务

    repeatable read 解决不可重复读,基于 行锁实现,是 inoodb默认的隔离级别 串行读取 并发的读取错误的问题都没了,但是会有很大的性能问题 Original: h…

    Java 2023年6月9日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球