热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Json协议参数校验在58App上的设计与应用

随着APP版本的迭代,Hybrid交互协议与页面跳转协议越来越多,带来了诸多问题。如下:有了需要解决

背景

Json 协议参数校验在 58 App 上的设计与应用

随着APP版本的迭代,Hybrid交互协议与页面跳转协议越来越多,带来了诸多问题。 如下:

  1. 协议文档平台更新不及时或者忘掉导致介入方使用时出现问题。

  2. server下发的协议信息出错导致hybrid调用或者页面跳转出错,无法统计线上协议出现的问题

  3. 对于必传参数没有合理的监控,导致有些必传参数会漏传

  4. 对Json协议解析成bean的解析器parser的重复编码,太过繁琐 针对以上各种问题,所以有了参数校验框架开发的初期思想。

方案探索

有了需要解决的问题,那么下一步就思考该如何解决这些问题。很快我们想到了第一套解决方案,注解方案。 自定义好注解,在工程里需要进行校验的数据bean上添加我们的注解。通过编译自动生成与bean对应的解析器parser,这个parer里注入了我们进行参数检查的代码。之后使用这套方案的时候发现与现在的工程兼容性不太好,具体的缺点下面会提到。 然后我们又想到了配置文件的方案,通过定义好配置文件作为参数检查的基准,下面详细介绍。

方案一

开始我们想到的注解方案像这样

public class JumpDemoParamsBen extends JumpParamsBaseBean{

    @JumpParams(key = "show",desc = "布尔")
    boolean show;

    @JumpParams(key = "string",desc = "string")
    String string;

    @JumpParams(key = "numbers",value = "[1,2,3,5,6]",desc = "数组")
    List numbers;

    @JumpParams(key = "log",value = "{'log':'log1','log2':'log2'}",desc = "埋点数据")
    HashMap hashMap;

    @JumpParams(key = "bean",desc = "bean")
    TabBean bean;

}

根据JumpParams注解生成Parser解析类动态生成解析方法,对解析异常信息进行记录埋点,对没有填充的字段设置默认值。然后通过反射调用生成的解析类。  

Json 协议参数校验在 58 App 上的设计与应用

但是该方案不能做到通用,而且最大的问题是编译时注解使用的限制。如,编译时注解在编译期运行的生命周期通常扫描一个Lib库后生命周期就结束,这对于想要一次性获得所有库的注解信息变得非常难。以及再加上编译时注解对后期解析协议生成bean这一步骤约束非常大,同时Hybrid介入的时候需要对注解处理器做一些额外的处理,而且页面跳转与action触发频繁的反射调用parser也是不能接受的。由于这些原因所以直接导致我们放弃使用编译时注解方案,寻求新的解决方案。

方案二

方案一中我们把参数校验信息放在了注解中(包括每个参数字段名称,参数是否必传,参数默认值,参数字段的说明),然后根据注解信息为每个Json生成对应的解析类。但在开发后应用发现了比较多的缺点,所以为了避免这些缺点我们不得不另寻他路。最终我们提出了一个以配置文件校验参数的方案,我们需要一个json校验规则配置信息。我们编写的配置文件也需要一一对应如果使用Json做配置层级太深对开发者来说不好编写而且阅读性也不是很强。最终我们使用XML作为Json校验的配置文件规则

方案一主要是对Parser的自动处理开发者不用关心该过程只处理拿到Bean即可,有没有一种方案我们可以统一处理传过来的Json协议数据然后统一返回落地数据。我们小组经过思考和讨论确立了如下图的方案。

  1. 通过配置文件的方式作为参数校验的依据。

  2. 我们对输入的Json数据校验,完成校验之后把数据输出到Map,以数据在原Json的层级位置转成path存为key,值为校验后的值。

  3. 落地页通过path从map取值即可。

Json 协议参数校验在 58 App 上的设计与应用

方案二应用与实现

方案实现分三部分,第一部分ParamsCheck,校验参数的核心部分;第二部分主要是对参数校验的应用,目前会在{Action协议,跳转协议}用到

ParamsCheck

如何应用

1、定义Json协议

{
   "url":"http://www.58.com",
   "title":"58同城",
   "setting":{
      "showtitle":true,
      "pullRefresh":false
   }
}

2、根据协议配置XML文件



    
    
    
         
         
    

如何校验

上面我们定义了一个协议,那参数校验框架是如何对协议进行校验的呢,下面我提出几个问题,然后对这几个问题逐个介绍。

我们可以做到哪些校验?

1、参数类型 如果参数类型与定义不符则记录

2、必传参数 如果在配置文件定义该参数为必传的,但协议数据没有传该参数,则记录

3、前端校验 在FE开发期间,如果没有必传参数可以及时给出提示。可以在开发期间避免必传参数没有

还有哪些我们期望做的校验但目前还不能做到的?

1、值的格式校验 目前只能做到协议key对应是否有值,而无法具体到值是什么样的格式

2、值的范围 假如对int类型的值定义了一个范围,不再范围以外的认为是错误的。

3、不同key的值相互具有关系 如果两个或多个key的值有一定关系,这种目前也无法办到

检测到问题是如何记录的?

在参数校验框架中发现问题并记录上报到应用方,记录的内容是具体出错的key,以所对应于协议中的路径keypath表示。应用方hybrid和跳转协议在app debug模式弹toatst提示,在release模式下以埋点方式上报到服务器,上报的信息包括出错的协议方或页面、error信息。

校验规则

关于校验规则我们更加注重统计出现错误的信息上报,这样APP上线后我们可以在后台及时发现server下发协议的问题并响应server及时的修改。

关于协议对于任何协议都会有必传字段和非必传字段。可以这么理解对于一个信息的详情页,信息的infoid就是一个必传字段跳转到详情页我们一定要给予一个infoid如果这个字段没有传的话或格式有误的话,跳转到详情也就无法正常展示。对于非必传字段表示协议可以不下发该字段,不下发的话我们会填充默认值。对于参数类型转换错误的我们会进行异常上报。以上即为参数校验的核心规则。

参数校验流程图

Json 协议参数校验在 58 App 上的设计与应用

协议文档生成

Json 协议参数校验在 58 App 上的设计与应用

由于我们配置了xml文件, 点击生成对应的业务线模块协议文档。 我们会匹配对应的xml生成改模块对应的json协议 ,然后上传到协议平台更新数据 。这样开发者就不需要每次手动去同步协议平台数据,在每次APP发版同步协议即可。

Json 协议参数校验在 58 App 上的设计与应用

总结

使用该参数校验的好处

1、开发期间协议数据出错有提示,在开发期间就可以发现问题 2、动态协议的统计,如果同一协议规则有多个业务方在使用,那么可以记录具体是哪个业务方数据出错 3、确保必要的参数一定有 4、通过简单的操作可以使协议文档与具体实现保持统一,大大减小繁杂的协议文档维护成本

目前58app跳转中心与Hybrid框架已添加参数校验功能,对协议下发出错问题有了很好的把控。开发者不必在频繁的编写Parser和Bean,提升了开发效率。协议平台及时更新,让协议使用方能够正确的使用最新的协议。达到了我们的最终目的。

问题

目前该参数校验框架虽然已经基本达到最初的构思与目的,但是随着对参数校验和现在项目的结合上的理解加深,通过对应用该框架到现在项目上的付出成本和最终所获得的收益的比例不太符合我们的预期。所以目前不太适合在我们现有的项目上推广该框架。但是在新项目上还是推荐使用该框架。

Json 协议参数校验在 58 App 上的设计与应用


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
author-avatar
松原连伟强_124
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有