如果你做web开发,那么你一定遇到过这样的问题,你的程序依赖于一些外部接口,这些接口是其他部门或团队提供的,通常,这些接口都是有文档说明的,你严格按照文档说明进行开发,从接口里获得数据,当接口里的数据结构发生变化时,会有人提前通知你,这样,你可以提早做准备,修改你的代码以便适应变化后的接口
然而,现实是残酷的,接口里的数据发生了变化,但是没有人告诉你,于是,你的程序从接口里获得错误的数据,解析的时候程序发生bug,进而影响服务,接下来你只好排查错误日志,定位问题,最后发现是API错了,你找到这个接口的负责人,告诉他问题,他承诺修改,并且保证不再发生类似的错误,但实际情况是,由于种种原因,那些你的服务所依赖的接口总是会发生错误,如果日志监控做的好,这样的问题可以快速发现,反之,等你发现问题时,错误已经在服务中存在一段时间了
如果能在收到接口返回数据后对数据进行检查,发现错误后输出日志或者报警,不就可以尽早的发现问题了么。
绝大多数错误都是下面两种
1、 字段类型发生变化
2、 缺少了一个字段
我写这个数据格式检查的思路非常简单,先根据一个正确的数据获得数据格式,然后依据这个数据格式对数据进行检查,接口的返回数据通常是json格式的,在python里,json.loads() 以后是一个字典,那么获取数据格式的过程就是一个深度优先的遍历过程,得到整个字典的格式并保存,然后据此检查新的数据
# coding=utf-8
from data_check import Data_Check
# 使用一个正确的数据初始化对象
data = {'age': {'age': 10,
'data': [{'data': {'key1': 323, 'key2': 323}},
{'data': {'key1': 323, 'key2': 323}}]
}
}
dc = Data_Check(data)
# 对新的数据进行检查 key2这个字段的值发生了变化
check_data = {'age': {'age': 10,
'data': [{'data': {'key1': 323, 'key2': 323}},
{'data': {'key1': 323, 'key2': '323'}}]
}
}
dc.check_data(check_data)
程序抛出的异常会准确说明那个字段的数据发生了错误
data_check.DataTypeErr: data type is <type 'str'> but expect type is number the err value is 323