最近用python写接口测试用例,发现一个比较新奇的问题,记录一下:
接口传参需要签名校验,签名方法是取所有参数的md5再拼接起来,如果参数是二维数组,需要先json化,下面是计算签名的例子:
# coding = utf-8
import hashlib
import json
def get_md5_value(string):
m = hashlib.md5()
m.update(string.encode('utf-8'))
return m.hexdigest()
def generate_sign(params):
str_to_be_sign = ''
for key in sorted_params:
if isinstance(params[key], list):
str_to_be_sign = str_to_be_sign + key + json.dumps(params[key])
else:
str_to_be_sign = str_to_be_sign + key + str(params[key])
return get_md5_value(str_to_be_sign)
if __name__ == '__main__':
param = {'data1': [{'data_id': 123}], 'data2': 0, 'time': '2019-01-15 10:01:27'}
print(generate_sign(param))
之前几个接口参数中没有数组也还挺正常,今天碰到一个带数组的参数,接口一直返回签名错误,也跟开发确认过参数列表没有问题,那只能是签名的计算出问题了,把md5之前的字符串打印出来发现{'data_id': 123}的冒号后面多了一个空格。。。,而data2与0之间又没有。。。先是用最简单粗暴的方法,把md5前字符串中的": "replace成":"去掉空格是可以了,就是感觉治标不治本。
再比较一下带不带数组区别就只有数组需要先经过json.dumps处理,找一找发现原来就是dumps处理时候,有个分隔符参数,未指定时默认是(", ", ": "),都是带空格的...,所以按照文档说明,指定分隔符为(":", ",")就可以了。后续如果有其它地方需要避免json化后出现空格的,就需要指定这个分隔符了。
if isinstance(params[key], list):
str_to_be_sign = str_to_be_sign + key + json.dumps(params[key], separators=(',', ':'))