API Gateway搭配Python Lambda是否必须返回JSON字符串格式响应体?
问题:API Gateway搭配Python Lambda返回502错误的原因?
我正在使用API Gateway搭配Python Lambda,编写的openapi.yml配置如下:
responses: "200": description: "200 response" content: application/json: schema: type: array items: type: object properties: table_id: type: integer format: int64 table_name: type: string
我的Python Lambda返回代码如下:
response = [{ "table_id": 2323, "table_name":"test_table_1" }, { "table_id": 1234, "table_name":"test_table_2" }] return { "statusCode": 200, "headers": {'Content-Type': 'application/json'}, "body": response };
运行后出现502错误:执行失败,配置错误,Lambda代理响应格式错误。但检查Lambda响应与openapi.yml配置后未发现问题。不过当我将代码改为"body": json.dumps(response)时,就能正常运行。
请问使用Lambda时是否必须将响应对象转为字符串,还是我遗漏了某些配置?
解答
当使用API Gateway的Lambda代理集成模式时,Lambda返回的body字段必须是字符串格式,这是硬性要求,并非你遗漏了配置。
原因在于:API Gateway的Lambda代理集成对响应格式有严格规范,其中body字段必须是可被直接传输的字符串类型(比如JSON字符串、纯文本等)。你直接传入Python原生的列表/字典对象时,API Gateway无法识别和处理这个Python对象,会导致解析失败,进而返回502错误。
你的OpenAPI配置没有问题,它定义的是API Gateway最终返回给客户端的响应结构;而Lambda返回的是给API Gateway的代理响应,两者层级不同——Lambda的body是API Gateway要转发(或已完成序列化)的内容,当你用json.dumps()把列表转为JSON字符串后,API Gateway就能正确识别该内容,将其作为响应体转发给客户端,同时匹配你定义的OpenAPI schema。
内容的提问来源于stack exchange,提问作者Ben P
相关产品推荐
相关产品推荐

