服务端解析curl POST JSON请求时bytearray空值与KeyError的解码方法
问题排查与解决方案
你遇到的KeyError本质是请求体为空导致解析后的字典没有对应字段,只要修正请求发送逻辑、正确解析二进制请求体即可解决。
首先修正curl命令的核心错误
你当前写的curl命令根本没有把本地JSON文件作为POST请求体发送,服务器自然收到空请求体,这就是你拿到bytearray(b'')的根本原因。
curl需要显式指定把本地文件作为请求体传递,正确命令格式:curl -X POST http://127.0.0.1:8080/eval/res -v --data-binary @path/request.json -H "Content-Type: application/json"
- 加
@前缀是curl读取本地文件作为请求体的固定写法,用--data-binary可以避免curl对JSON内容做不必要的转义,保证结构完整。 - 显式声明
Content-Type: application/json头,避免部分服务框架对请求体类型识别错误。
其次处理bytearray类型的请求体
就算修正curl命令后,多数Python服务框架会默认把接收到的POST二进制请求体存为bytearray类型,不能直接对它做dict()转换,需要先解码再解析为JSON字典。
正确处理逻辑
- 从请求迭代数据中取出请求体内容
- 把bytearray/bytes用UTF-8编码解码为字符串(JSON通用默认编码)
- 用
json.loads()把字符串解析为Python原生字典 - 再做后续的字段读取操作
修正后的preprocess方法示例
import json def preprocess(self, data): for row in data: # 优先取data字段,无则取body字段 request_body = row.get("data") or row.get("body") # 处理bytearray/bytes类型的请求体 if isinstance(request_body, (bytearray, bytes)): # 解码为UTF-8字符串,errors="ignore"避免异常编码导致崩溃 body_str = request_body.decode("utf-8", errors="ignore") # 解析JSON字符串为字典 json_obj = json.loads(body_str) # 若请求体已被框架解析为字典则直接使用 elif isinstance(request_body, dict): json_obj = request_body else: raise ValueError("无法识别的请求体格式") self.parameter_dict = json_obj image_url = "" # 原有后续逻辑 for img_inputs, msk_inputs in zip(json_obj['imgX'], json_obj['imgY']): key = img_inputs['key']
额外排查点
- 改完curl命令后如果还是拿到空body,先检查
path/request.json的文件路径是否正确、当前运行用户有没有文件读权限 - 可以先打印
row的全部键值对,确认框架实际把请求体存在哪个字段里,避免写死data/body取值逻辑 - 不要直接对bytearray做
dict()转换,bytearray是二进制字节类数据,不是字典结构,强行转换只会抛出类型错误
内容的提问来源于stack exchange,提问作者singa1994
相关产品推荐
相关产品推荐

