如何在Lambda中获取原始正文字符串(API网关Lambda代理)

时间:2017-02-13 02:08:12

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

在API网关上启用CORS后,这是我发送到http端点的请求:

    $.ajax({
        type: 'put',
        url: 'https://xxxxx.execute-api.us-east-1.amazonaws.com/dev/artist/application/julian_test',
        data: {params: {param1: "543543", param2: "fdasghdfghdf", test: "yes"}},
        success: function(msg){
            console.log(msg);
        },
        error: function(msg){
            console.log(msg);
        }
    });

这是lambda函数(我正在使用node serverless包,并且代码没有错误):

module.exports.julian_test = (event, context, callback) => {
    console.log(event);
    console.log(event.body);

var response_success = {
    statusCode: 200,
    headers: {
        "Access-Control-Allow-Origin": "*"
    },
    body: JSON.stringify({
        firstUser: {
            username: "Julian",
            email: "awesome"
        },
        secondUser: {
            username: "Victor",
            email: "hello world"
        },
        thirdUser: {
            username: "Peter",
            email: "nice"
        }
    })
};
    callback(null, response_success);
};

console.log(event.body)注销:             PARAMS%5Bparam1%5D = 543543&安培; PARAMS%5Bparam2%5D = fdasghdfghdf&安培; PARAMS%5Btest%5D =是

,这不是我想要的格式。我检查了OPTIONS Integration Request / body mapping模板,这里是快照。

enter image description here

我试图删除“application / json”但之后我收到以下回复:

XMLHttpRequest无法加载https://xxxxxx.execute-api.us-east-1.amazonaws.com/dev/artist/application/julian_test。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许原点'null'访问。响应的HTTP状态代码为500。

有谁知道如何在后端lambda中获取原始字符串请求主体?请帮忙!

3 个答案:

答案 0 :(得分:2)

屏幕截图适用于用于CORS的OPTIONS方法。

您的实际Lambda函数调用可能是通过POST方法进行的。请检查POST方法下的集成请求Body映射模板。如果设置为通过body(默认值),则输入请求中的正文应按原样传递给Lambda。

请使用API​​网关控制台中的测试功能查看输入如何转换为集成请求。这应该可以帮助您调试。

答案 1 :(得分:0)

这里有两件事:

首先,在您的API网关资源下,转到Method Response并确保您对[{1}}映射有响应。

其次,在您的API网关资源下,转到200 OK,在Integration Request下选择Body Mapping Templates,然后在模板文本编辑器中输入以下代码:

application/json

应用此选项后,您可以访问您的请求对象:(Node.js)

{
  "method": "$context.httpMethod",
  "body" : $input.json('$'),
  "headers": {
    #foreach($param in $input.params().header.keySet())
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end

    #end
  },
  "queryParams": {
    #foreach($param in $input.params().querystring.keySet())
    "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end

    #end
  },
  "pathParams": {
    #foreach($param in $input.params().path.keySet())
    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end

    #end
  }  
}

我花了一些时间来弄明白这一点,向Kenn Brodhagen道具说明: tutorial

答案 2 :(得分:0)

获得真实原始AWS Lambda请求的唯一方法是通过Stream for Handler Input

根据文档:

  

输入有效负载必须是有效的JSON,但输出流没有此类限制。支持任何字节。

以Java流式传输AWS Lambda输入和输出的示例:

public void handler(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        int letter;
        while((letter = inputStream.read()) != -1)
        {
            outputStream.write(Character.toUpperCase(letter));
        }
    }