栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【Py】接口签名校验失败可能是由于ensure

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Py】接口签名校验失败可能是由于ensure

项目场景:

客户端:requests
服务端:Flask

客户端发请求前对请求签名,服务端对签名进行校验


问题描述

服务端签名校验失败,即生成的签名与客户端的不一致


原因分析:

假设我们的请求体为

data = {
    "a": "你好"
}

在对字典数据进行json序列化时使用了如下代码

json.dumps(data, ensure_ascii=False)

其中的ensure_ascii参数是控制是否在序列化时使用ascii编码,默认为使用。效果就是中文字符全部变为unicode编码,这是因为中文字符不在ascii编码中。

'{"a": "\u4f60\u597d"}'

json序列化后对其进行签名,得到signature
再通过requests将请求发送出去

requests('http://xx.xx.xx.xx', json=data)

可能你已经发现问题了:requests中的json=data默认是使用ascii编码的,所以这就导致服务端进行签名时使用的请求体与客户端的不一样,签名必然失败(有非ascii字符时)


解决方案:

统一签名和发送请求时的序列化规则即可

json.dumps(data, ensure_ascii=False)
requests(..., data=json.dumps(data, ensure_ascii=False).encode('utf-8'))

或

json.dumps(data, ensure_ascii=True)
requests(..., json=data)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/948297.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号