首页 文章

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

提问于
浏览
1

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

$.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函数(我使用节点无服务器包,并且代码没有错误):

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 = yes

,这不是我想要的格式 . 我查看了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 . 因此,不允许对预检请求作出响应,因此不允许访问 - 控制 - 允许 - 原点' header is present on the requested resource. Origin ' null . 响应的HTTP状态代码为500 .

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

2 回答

  • 2

    这里有两件事:

    首先,在您的API网关资源下,转到 Method Response 并确保您有 200 OK 映射的响应 .

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

    {
      "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
      }  
    }
    

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

    console.log('Body:', event.body);
      console.log('Headers:', event.headers);
      console.log('Method:', event.method);
      console.log('Params:', event.params);
      console.log('Query:', event.query);
    

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

  • 1

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

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

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

相关问题