我创建了一个简单的AWS Lambda函数,使用python 3.6将两个数字相加。它在json主体中读取val1
和val2
值。当我在lambda控制台中测试lambda函数时,它可以正常工作。但是,当我通过使用POSTMAN的AWS API网关通过POST请求通过调用lambda函数时,它的响应为“消息”:“内部服务器错误”(502错误的网关)。有人可以帮我解决这个错误吗?
Lambda函数
import json
def lambda_handler(event, context):
# TODO implement
val1 = int(event['val1'])
val2 = int(event['val2'])
val3 = val1 + val2
return {
'statusCode': 200,
'headers': {'Content-Type': 'application/json'},
'body': json.dumps(val3)
}
JSON正文
{
"val1": "3",
"val2": "5"
}
答案 0 :(得分:3)
由于事件对象(Python词典)的行为而发生此错误。当您在lambda控制台中测试lambda函数时,JSON主体将直接传递给事件对象。但是,当您通过API网关进行尝试时,不仅事件对象是请求有效负载,而且body属性也被设置为字符串。
例如,事件对象中的JSON正文将是这样
body: "{\n \"val1\": \"3\",\n \"val2\": \"5\"\n}"
要解决此错误,请尝试json.loads()方法将主体字符串转换为json。
import json
def lambda_handler(event, context):
# TODO implement
try:
event = json.loads(event['body'])
val1 = int(event['val1'])
val2 = int(event['val2'])
val3 = val1 + val2
except:
val3 = 'request error'
return {
'statusCode': 200,
'headers': {'Content-Type': 'application/json'},
'body': json.dumps(val3)
}
答案 1 :(得分:0)
我最终遇到了同样的错误,只是我使用的是 Serverless 和 Node.js。 我在没有在正文上使用 stringify 的情况下返回了一个 HTTP 响应。如下面的坏例子所示:
不好:
return {
statusCode,
body: body.message,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true,
},
};
};
}
好:
return {
statusCode,
body: JSON.stringify(body.message),
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true,
},
};
};
}
我希望这能帮助其他可能遇到 502 错误的人。