我已经创建了一个示例lambda函数来生成成功&错误回复。功能如下
exports.handler = (event, context, callback) => {
if(event.val1=="1")
{
callback(null, 'success');
}else
{
callback(true, 'fail');
}
};
当我使用API网关测试此功能时,我得到了不同的响应体,但响应代码是相同的(总是返回200 ok响应代码)。
是否可以从lambda函数自定义状态代码(例如:错误响应需要500,成功响应需要200)?
答案 0 :(得分:2)
要从AWS API GW发送自定义错误代码,您应该在集成响应中使用响应映射模板。 您基本上为要从API GW返回的每个状态代码定义正则表达式。
步骤:
使用此配置,API GW返回给客户端的HTTP返回码与“selectionPattern”中的正则表达式匹配。
最后,我强烈建议使用API GW框架来处理这些配置,Serverless是一个非常好的框架。
使用Servereless,您可以按如下方式定义模板( serverless 0.5 snippet ):
myResponseTemplate:
application/json;charset=UTF-8: |
#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage'))) {
"status" : $errorMessageObj.status,
"error":{
"error_message":"$errorMessageObj.error.message",
"details":"$errorMessageObj.error.custom_message"
}
}
responsesValues:
'202':
selectionPattern: '.*"status": 202.*'
statusCode: '202'
responseParameters: {}
responseModels: {}
responseTemplates: '$${myResponseTemplate}'
'400':
selectionPattern: '.*"status": 400.*'
statusCode: '400'
responseParameters: {}
responseModels: {}
responseTemplates: '$${myResponseTemplate}'
然后简单地从lambda返回一个json对象,如下面的python片段(你可以在nodejs中使用类似的方法):
def handler(event, context):
# Your function code ...
response = {
'status':400,
'error':{
'error_message' : 'your message',
'details' : 'your details'
}
}
return response
我希望这会有所帮助。
-G。
答案 1 :(得分:1)
您可能需要查看API Gateway的新简化Lambda proxy功能。
使用此功能,您可以直接从Lambda定义状态代码,返回标题和正文内容。
docs中的示例:
'use strict';
console.log('Loading hello world function');
exports.handler = function(event, context) {
var name = "World";
var responseCode = 200;
console.log("request: " + JSON.stringify(event));
if (event.queryStringParameters !== null && event.queryStringParameters !== undefined) {
if (event.queryStringParameters.name !== undefined && event.queryStringParameters.name !== null && event.queryStringParameters.name !== "") {
console.log("Received name: " + event.queryStringParameters.name);
name = event.queryStringParameters.name;
}
if (event.queryStringParameters.httpStatus !== undefined && event.queryStringParameters.httpStatus !== null && event.queryStringParameters.httpStatus !== "") {
console.log("Received http status: " + event.queryStringParameters.httpStatus);
responseCode = event.queryStringParameters.httpStatus;
}
}
var responseBody = {
message: "Hello " + name + "!",
input: event
};
var response = {
statusCode: responseCode,
headers: {
"x-custom-header" : "my custom header value"
},
body: JSON.stringify(responseBody)
};
console.log("response: " + JSON.stringify(response))
context.succeed(response);
};