Python对接POST接口时如何按指定格式构造带动态变量的payload
报错核心原因
- 该接口对payload的校验是精确字符串格式匹配,并非只要包含正确字段的JSON就能正常解析
- 你直接传Python字典时,一般是把字典传入requests的
json参数,requests会按默认规则序列化JSON,生成的字符串和接口要求的格式存在明确差异:- 换行符用默认的
\n而非接口要求的\r\n - 键与值之间的冒号没有前置空格
- 末尾没有要求的4个多余换行
- 换行符用默认的
- 接口的解析逻辑兼容性差,遇到格式不符的payload就会直接判定核心字段缺失,返回301报错
动态传值实现步骤
1. 定义动态取值的字段
从前端表单拿到type和smartCardNo的动态值,固定字段serviceCode保持和文档一致:
# 根据自己的后端框架调整从前端取数的逻辑,这里以常见的Flask为例 dynamic_type = request.form.get("type") dynamic_smartcard = request.form.get("smartCardNo") payload_dict = { "serviceCode": "V-TV", "type": dynamic_type, "smartCardNo": dynamic_smartcard }
2. 按接口要求格式序列化字典
通过json库的参数调整,生成和文档示例完全一致的字符串结构:
import json # 序列化时匹配接口要求的格式 serialized_content = json.dumps( payload_dict, indent=0, separators=(',', ' : '), # 将默认的': '分隔符调整为前后带空格的' : ' ensure_ascii=False ).replace('\n', '\r\n') # 把默认换行替换为接口要求的CRLF换行 # 末尾补4个换行,完全匹配文档给出的payload示例 final_payload = serialized_content + '\r\n\r\n\r\n\r\n'
3. 发送请求时传递原始字符串
不要用requests的json参数(会自动篡改序列化格式),用data参数直接传构造好的字符串,同时指定正确的请求头:
import requests headers = { "Content-Type": "application/json" } resp = requests.post( url="目标接口地址", data=final_payload.encode("utf-8"), headers=headers )
校验方法:打印生成的
final_payload,和接口文档给出的示例字符串逐字符对比,只要结构完全一致,接口就能正常识别所有字段,不会再出现serviceCode缺失的报错。
内容的提问来源于stack exchange,提问作者Babayega
相关产品推荐
相关产品推荐

