首页 > 其他分享 >服务 API 设计之 ——API 参数规范

服务 API 设计之 ——API 参数规范

时间:2023-04-07 16:33:23浏览次数:32  
标签:Dubbo 调用 String 规范 校验 API 参数 Response

服务 API 设计之 ——API 参数规范_自定义

【强制】字段名称用小驼峰风格


【强制】Service API 返回值必须使用 Response 包装

  • Service API 返回值强制要求进行通用包装,例如:Response。
  • Response 的作用:
  1. 统一方法表示 API 调用是否成功
  2. API 调用失败时,统一格式反馈错误 Code,错误 Message
  3. 统一的 Response 易于调用方经验复用,框架集成
  • 作为 API 调用方,其编码诉求很简单:
  1. API 调用是否成功;
  2. 调用不成功时,提示文案是什么;
  • 调用方几不想:
  1. 不想关心 API 内部有多牛逼
  2. 不想关心 API 可能会抛的各种 Exception,以及因此不得不做各种异常处理
  • 关于当前不统一的 Response
  • 【新业务】【强制】使用架构组定义的统一 Response:ZCY Response
  • 目前业务方有自定义 Result/Response,风格和作用大同小异。有更好的设计可以自荐给架构组集成,杜绝各自开辟重复的新定义。


【强制】杜绝完全不规范的缩写,避免望文不知义。(国际通用缩写除外)

  • 错误实践
  • AbstractClass “缩写” 命名成 AbsClass;
  • condition “缩写” 命名成 condi;
  • 此类随意缩写严重降低了代码的可阅读性。


【强制】禁止使用 Map 作为参数类型

Map<K,V> 机制非常灵活,但这样的灵活却是负作用巨大。

  1. Map 的数据说明是晦涩的,调用方、实现方之间需要具有隐式的契约解释支持哪些 Key,每个 Key 的 Value 是什么类型。增加了双方的使用复杂度。
  2. Map<K,V> 不可被校验。加之第 1 条的使用复杂度,导致使用上非常容易出错。
  3. 用 Map 类型字段做预留扩展性的设计都是不优雅的设计。

注:参数中的调用方自定义数据部分允许使用 Map。API 提供方不关系、不解析、只透传。


【强制】业务对象 / 查询条件用 DTO 封装,禁止以入参方式平铺字段。

  • 正确实践

分页查询,将查询条件以 DTO 方式包装。

Dubbo 序列化特点:

  • Dubbo API 的 POJO 类中,UID 不一致:没关系。
  • Dubbo API 的 POJO 类中,字段数量不一致:没关系,只要字段名和类型一致,数据能反序列化成功。
  • 发送方比接收方的字段多:没关系。
  • 发送方比接收方的字段少:没关系。
1
Response<Page<T>> pagingXXX(QueryDTO q)
  • 错误实践
1
Response<Page<T>> pagingXXX(String name, String code, Long orgId, Long creatorId, Integer pageNo, Integer PageSize)

以上错误实践缺点:
1、对于调用方来说,无论以什么条件查询,都需要逐个条件传参。
2、API 对扩展不友好,一旦想增加查询条件,API 就不兼容。


【推荐】DTO 字段设置 JSR303 Annotation 进行基础校验

  • 正确实践
1
2
3
public interface ZcyPayFacade {
    Result<Boolean> validTradePay(@NotNull @Valid TradePayPO tradePayPO);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class TradePayPO implements Serializable {

    @NotBlank
    @Length(max = 15)
    /** 业务交易编号(订单编号) */
    private String businessTradeNo;

    /**
     * 业务渠道:1-订阅,2-CA
     * @see BusinessTypeEnum
     *
     * */
    @NotNull
    @Range(min = 1, max = 2)
    private Integer businessType;

    ......
    
    /** 商户名称(商家) */
    @NotBlank
    @Length(max = 50)
    private String merchantName;

    /** 订单标题(即商品名称),粗略描述用户的支付目的。如“喜士多(浦东店)消费”*/
    @NotBlank
    @Length(max = 256)
    private String orderSubject;

    /** 订单描述(即商品描述),可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"*/
    @NotBlank
    @Length(max = 128)
    private String orderBody;

    ......
}


【推荐】在客户端完成基础字段校验

  • 方式 1:【推荐】自定义 Dubbo Filter 实现通用拦截、校验。
  • 方式 2:【推荐】通过 Builder 模式构建入参对象。
  • 方式 3:【不推荐】Dubbo 客户端参数校验,要求 consumer 方设置 validation=”true”,Dubbo 客户端参数校验。缺点:以抛异常方式处理校验失败,需要业务方额外处理 Exception。而且,IDE 并不会提示 consumer 方需要处理 ConstraintViolationException。
  • 方式 4:Dubbo 方式,local-stub 特性。实现较复杂,校验代码通用性低。Dubbo local-stub

标签:Dubbo,调用,String,规范,校验,API,参数,Response
From: https://blog.51cto.com/u_15964265/6176384

相关文章

  • druid yml 参数配置
    spring: datasource: #druid连接池 type:com.alibaba.druid.pool.DruidDataSource #数据库驱动 driver:com.mysql.jdbc.Driver #最大连接池数量 max-active:20 #初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 initial-size:10......
  • MIPI/LVDS/PCIE/HDMI 设计规范
          ......
  • [c#.net资料]将VS2019的智能提示改为中文(API汉化)
    一.查看VS本地化文件夹对应版本1)进入目录:C:\ProgramFiles\dotnet\packs2)查看以下两个文件内对应的版本二.下载微软本地化IntelliSense文件1)打开微软的本地化IntelliSense文件下载页:https://dotnet.microsoft.com/download/intellisense2)在里面选择对应版本的本地......
  • OpenAI Python API 训练营:学习使用 AI、GPT3 等!
    OpenAIPythonAPI训练营:学习使用AI、GPT3等!使用OpenAI强大的API在项目中生成文本和图像,探索人工智能的力量课程英文名:OpenAIPythonAPIBootcampLearntouseAI,GPT3,andmore!此视频教程共3.24GB,中英双语字幕,画质清晰无水印,源码附件全课程地址:https://xueshu.f......
  • Algorithm参数记录
    一、vector<Point2f>vector是一个存储二维点坐标的容器,其中每个元素都是一个Point2f类型的对象。在OpenCV中,Point2f表示一个由两个单精度浮点数构成的二维点坐标。你可以使用vector来存储一些二维坐标信息,比如图像中的关键点或轮廓点等。具体用法可以参考下面的示例:#include<o......
  • kubernetes API服务器的安全防护
    kubernetesAPI服务器的安全防护 posted@ 2019-08-1114:54  姚红 阅读(998) 评论(0)  编辑  收藏  举报分类: 云计算-k8sundefined目录12.1.了解认证机制12.1.2ServiceAccount介绍12.1.3创建ServiceAccount12.1.4将ServiceAccount分配给pod1......
  • 二极管参数详解
    最大平均整流电流IF: 指二极管长时间工作时允许的最大正向平均电流。这个电流是由PN结的结面积和散热条件决定的。使用时要注意,通过二极管的平均电流不能超过这个值,要满足散热条件。例如,1N4000系列二极管的中频为1A。最大反向工作电压VR :指二极管两端允许施加的最大反向电压......
  • 常见API,对象克隆
    目录学习目标1Math类1.1概述1.2常见方法1.3算法小题(质数)1.4算法小题(自幂数)1.5课后练习2System类2.1概述2.2常见方法3Runtime3.1概述3.2常见方法3.3恶搞好基友4Object类4.1概述4.2常见方法5Objects类5.1概述5.2常见方法6BigInteger类6.1引入6.2概述6.3......
  • .net webapi 客户端缓存 服务端缓存
    客户端缓存-ResponseCacheAttribute通过设置HTTP的响应头Cache-Control来完成页面存储到浏览器缓存中,如果请求在缓存有效期间就直接从浏览器缓存中取出数据。只需要在接口上方添加ResponseCacheAttribute特性即可设置客户端缓存。ResponseCacheAttribute可应用于:Razor......
  • 微信生成带参数二维码,跳转公众号
    classWxfollow{protected$appid='wxf1d959b99f33b156';protected$secret='248f3a560604555ec96215c085cb2723';protected$url="";protected$access_tokens="";publicfunction__con......