如何正确构造带反斜杠转义的字典作为REST API POST请求体
构造含转义反斜杠的REST API POST请求体方案
- 错误本质:手动叠加反斜杠转义的写法,混淆了Python原生字符串转义、JSON序列化自动转义两层独立逻辑,要么触发语法错误,要么出现转义过度/不足的问题。
- 最优实现:完全不需要手动书写反斜杠转义,借助Python标准库
json自动完成转义处理,从根源规避手写错误。
参考实现代码:
import json import requests # 先构造payload对应的原生字典,无需任何转义处理 payload_content = {"value": 42} # 组装完整请求体结构 request_body = { "packet": { "payload_encoding": "json", # json.dumps会自动将字典转为符合JSON规范的字符串,内部双引号的转义反斜杠会自动添加 "payload": json.dumps(payload_content), "transceived_at": "2017-07-31T12:15:18.289981Z" } } # 发送POST请求时直接将构造好的字典传入json参数,requests库会自动完成最终的JSON序列化,转义逻辑完全符合规范 response = requests.post("目标API地址", json=request_body)
之前尝试的写法问题说明
r"\":属于Python语法错误,原始字符串不允许以奇数个反斜杠结尾,代码无法正常运行\\\\:属于转义过度,最终序列化生成的请求体会携带多余反斜杠,不符合接口格式要求"\\\":存在两处错误,一是字符串引号未闭合触发语法错误,二是转义层数计算错误,输出结果无法匹配预期
效果验证
执行以下代码可以直接打印序列化后的最终请求体,输出和目标结构完全一致(标准JSON会自动移除字段末尾多余的逗号,属于合法格式):
import json payload_content = {"value": 42} request_body = { "packet": { "payload_encoding": "json", "payload": json.dumps(payload_content), "transceived_at": "2017-07-31T12:15:18.289981Z" } } print(json.dumps(request_body, indent=4))
打印输出结果:
{ "packet": { "payload_encoding": "json", "payload": "{\"value\": 42}", "transceived_at": "2017-07-31T12:15:18.289981Z" } }
内容的提问来源于stack exchange,提问作者Gamsner
相关产品推荐
相关产品推荐

