AWS Lambda中API请求JSON参数验证失败问题求助
问题原因及解决方案
核心问题
你打印的event中body是JSON格式的字符串,并非Python字典。直接用eventJson['body']['STTN']访问会触发异常——因为字符串不支持字典式的键取值逻辑,所以代码进入except块返回验证失败。
正确验证步骤
- 解析JSON字符串为Python字典
使用json.loads()方法将body字符串转换为字典,同时要捕获解析失败的异常(比如body为空、格式不合法)。 - 验证解析后的字典字段
基于转换后的字典,检查目标字段是否存在、是否为有效值。
修正后的代码示例
import json # 假设eventJson是你获取的event对象 try: # 将body字符串解析为Python字典 body_dict = json.loads(eventJson['body']) except json.JSONDecodeError: returnValidateConditional = False validationResponse['apiStatus'] = "failed" validationResponse['apiErrorCode'] = "2" validationResponse['apiDescription'] = "请求体格式非法,需为JSON格式" statusCode = 400 return [returnValidateConditional, validationResponse, statusCode] # 验证STTN字段 try: sttn = body_dict['STTN'] # 可选:额外验证STTN是否为有效非空值 if not sttn.strip(): raise ValueError("STTN不能为空") except (KeyError, ValueError): returnValidateConditional = False validationResponse['apiStatus'] = "failed" validationResponse['apiErrorCode'] = "1" validationResponse['apiDescription'] = "STTN是必填项或格式无效" statusCode = 415 return [returnValidateConditional, validationResponse, statusCode] # 验证Account字段 try: account = body_dict['Account'] # 可选:额外验证Account是否为有效非空值 if not account.strip(): raise ValueError("Account不能为空") except (KeyError, ValueError): returnValidateConditional = False validationResponse['apiStatus'] = "failed" validationResponse['apiErrorCode'] = "1" validationResponse['apiDescription'] = "Account是必填项或格式无效" statusCode = 415 return [returnValidateConditional, validationResponse, statusCode] # 验证通过后的后续逻辑 returnValidateConditional = True # ...你的业务代码
补充说明
- 若使用API Gateway的Lambda代理集成,可在网关配置中设置请求模板自动解析JSON,但手动解析的方式对异常情况更可控。
- 建议提前判断
eventJson['body']是否为空,避免解析空字符串触发报错。
内容的提问来源于stack exchange,提问作者Baba
相关产品推荐
相关产品推荐

