You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

服务端解析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字典。

正确处理逻辑

  1. 从请求迭代数据中取出请求体内容
  2. 把bytearray/bytes用UTF-8编码解码为字符串(JSON通用默认编码)
  3. 用json.loads()把字符串解析为Python原生字典
  4. 再做后续的字段读取操作

修正后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 19:36:04