【问题标题】:Lambda return only 200 respose codeLambda 仅返回 200 响应代码
【发布时间】:2017-01-29 18:22:48
【问题描述】:

我创建了一个示例 lambda 函数,用于生成成功和错误响应。功能如下

exports.handler = (event, context, callback) => {
if(event.val1=="1")
{
 callback(null, 'success');
}else
{
 callback(true, 'fail');
}
};

当我使用 API Gateway 测试此功能时,我得到了不同的响应正文,但响应代码相同(始终返回 200 ok 响应代码)。

是否可以通过 lambda 函数自定义状态码(例如:错误响应需要 500,成功响应需要 200)?

【问题讨论】:

标签: amazon-web-services aws-lambda aws-api-gateway


【解决方案1】:

您可能想查看 API Gateway 的新简化 Lambda proxy 功能。

使用它,您可以直接从 Lambda 定义状态代码、返回标头和正文内容。

来自文档的示例:

'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);
};

【讨论】:

    【解决方案2】:

    为了从 AWS API GW 发送自定义错误代码,您应该在集成响应中使用响应映射模板。 您基本上为要从 API GW 返回的每个状态代码定义一个正则表达式。

    步骤:

    使用此配置,API GW 向客户端返回的 HTTP 返回码与 "selectionPattern" 中的正则表达式匹配。

    最后我强烈建议使用 API GW 框架来处理这些配置,Serverless 是一个非常好的框架。

    使用 Servereless,您可以如下定义模板(serverless 0.5 sn-p):

    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 sn-p (你可以在 nodejs 中使用类似的方法):

     def handler(event, context):
         # Your function code ...
         response = { 
             'status':400, 
             'error':{
                 'error_message' : 'your message',
                 'details' : 'your details'
              }
         }
        return response
    

    我希望这会有所帮助。

    G.

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多