Tornado handler调用json.loads(request.body)返回字符串问题如何解决
问题根因
requests库post方法的json参数原生支持自动将传入的Python对象序列化为JSON请求体,同时自动添加Content-Type: application/json请求头。你的代码中先手动调用json.dumps(x)把字典转成了JSON字符串,再将该字符串传给json参数,会触发requests对这个字符串做二次JSON序列化,最终发送的请求体就是两层转义的格式:外层多了一层引号包裹,也就是你观察到的b'"{\"inputs\":...}"'结构。因此服务端第一次json.loads只能解析出内层的JSON字符串,需要再解析一次才能拿到字典。
修复方案
任选以下任意一种方式修改请求代码即可:
方案1(推荐):直接传字典给json参数
去掉手动序列化步骤,由requests自动完成JSON序列化:
with open("ee", "rb") as image_file: encoded_string = base64.b64encode(image_file.read()) x = {"inputs": {"key1": encoded_string.decode("utf-8")}} # 直接将字典对象传给json参数 <request_session>.post(<HOST>, json=x)
方案2:手动序列化时改用data参数
如果你需要自行控制序列化逻辑,就不要使用json参数,改为通过data参数传递序列化后的字符串,同时手动指定请求头:
with open("ee", "rb") as image_file: encoded_string = base64.b64encode(image_file.read()) x = {"inputs": {"key1": encoded_string.decode("utf-8")}} # 手动序列化时使用data参数,同步指定Content-Type请求头 <request_session>.post(<HOST>, data=json.dumps(x), headers={"Content-Type": "application/json"})
修改后服务端调用一次json.loads(request.body)就能直接得到字典类型的解析结果。
内容的提问来源于stack exchange,提问作者Sid Anand
相关产品推荐
相关产品推荐

