当前位置:  开发笔记 > 编程语言 > 正文

通过API网关在aws Lambda中获取json主体

如何解决《通过API网关在awsLambda中获取json主体》经验,为你挑选了2个好方法。

我目前正在使用NodeJS通过AWS Api Gateway在AWS lambda上构建机器人,我遇到了POST请求和JSON数据的问题.我的api使用'使用Lambda代理集成',甚至当我测试代理发送内容类型的Application/json和一些json在体内时,例如{"foo":"bar"}我无法访问该对象而不先解析它

例如

  var json = JSON.parse(event.body);
  console.log(json.foo);

现在我知道通过JSON.parse运行它似乎并不是什么大不了的事,但我已经看到了许多其他例子,根本不是这种情况.请看这里https://github.com/pinzler/fb-messenger-bot-aws-lambda/blob/master/index.js

我是否需要向API网关添加任何内容才能正确处理?'post method request'部分中的'request body'步骤具有针对请求主体的内容类型application/json设置.

据我所知,上面例子的自述文件似乎没有使用代理集成,所以我不确定我应该在这里做什么



1> Ka Hou Ieong..:

您可以在API网关中配置两种不同的Lambda集成,例如Lambda集成和Lambda代理集成.对于Lambda集成,您可以在您不需要解析主体的有效负载中自定义要传递给Lambda的内容,但是当您在API网关中使用Lambda代理集成时,API Gateway将在有效负载中将所有内容代理到Lambda像这样,

{
    "message": "Hello me!",
    "input": {
        "path": "/test/hello",
        "headers": {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
            "Accept-Encoding": "gzip, deflate, lzma, sdch, br",
            "Accept-Language": "en-US,en;q=0.8",
            "CloudFront-Forwarded-Proto": "https",
            "CloudFront-Is-Desktop-Viewer": "true",
            "CloudFront-Is-Mobile-Viewer": "false",
            "CloudFront-Is-SmartTV-Viewer": "false",
            "CloudFront-Is-Tablet-Viewer": "false",
            "CloudFront-Viewer-Country": "US",
            "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
            "Upgrade-Insecure-Requests": "1",
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
            "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
            "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
            "X-Forwarded-For": "192.168.100.1, 192.168.1.1",
            "X-Forwarded-Port": "443",
            "X-Forwarded-Proto": "https"
        },
        "pathParameters": {"proxy": "hello"},
        "requestContext": {
            "accountId": "123456789012",
            "resourceId": "us4z18",
            "stage": "test",
            "requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9",
            "identity": {
                "cognitoIdentityPoolId": "",
                "accountId": "",
                "cognitoIdentityId": "",
                "caller": "",
                "apiKey": "",
                "sourceIp": "192.168.100.1",
                "cognitoAuthenticationType": "",
                "cognitoAuthenticationProvider": "",
                "userArn": "",
                "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
                "user": ""
            },
            "resourcePath": "/{proxy+}",
            "httpMethod": "GET",
            "apiId": "wt6mne2s9k"
        },
        "resource": "/{proxy+}",
        "httpMethod": "GET",
        "queryStringParameters": {"name": "me"},
        "stageVariables": {"stageVarName": "stageVarValue"},
        "body": "{\"foo\":\"bar\"}",
        "isBase64Encoded": false
    }
}

对于您正在引用的示例,它不是从原始请求中获取正文.它正在将响应主体构建回API网关.它应该是这种格式,

{
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "...",
    "isBase64Encoded": false
}


然后是JSON.parse(event.body)(Lambda代理集成)

2> mon..:

我认为使用API​​ Gateway与Lambda集成时需要了解一些事项.

Lambda集成与Lambda代理集成

过去只有Lambda Integration需要映射模板.我想这就是为什么仍然会看到许多使用它的例子.

如何从Amazon API Gateway将查询字符串或路由参数传递给AWS Lambda

截至2017年9月,您不再需要配置映射来访问请求正文.

AWS上的无服务器架构

Lambda代理集成,如果启用它,API Gateway会将每个请求映射到JSON,并将其作为事件对象传递给Lambda.在Lambda函数中,您将能够从中检索查询字符串参数,标题,阶段变量,路径参数,请求上下文和正文.

如果不启用Lambda代理集成,则必须在API网关的"集成请求"部分中创建映射模板,并决定如何自己将HTTP请求映射到JSON.如果要将信息传递回客户端,则可能必须创建集成响应映射.

在添加Lambda代理集成之前,用户被迫手动映射请求和响应,这是令人惊愕的一个来源,尤其是对于更复杂的映射.

body是转义字符串,而不是JSON

使用Lambda代理集成,lambda事件中的正文是一个使用反斜杠转义的字符串,而不是JSON.

"body": "{\"foo\":\"bar\"}" 

如果在JSON格式化程序中测试.

Parse error on line 1:
{\"foo\":\"bar\"}
-^
Expecting 'STRING', '}', got 'undefined'

以下文件是关于答复,但它应适用于请求.

我收到了"格式错误的Lambda代理响应"错误或带有Amazon API Gateway的502状态代码.我该如何解决这个问题?

如果要返回JSON,则body字段必须转换为字符串,否则将导致响应的进一步问题.您可以使用JSON.stringify在Node.js函数中处理此问题; 其他运行时需要不同的解决方案,但概念是相同的.

要让JavaScript作为JSON对象访问它,需要使用JapaScript中的json.parse,Python中的json.dumps将其转换回JSON对象.

如何在JavaScript中使用JSON

字符串对于传输非常有用,但您希望能够将它们转换回客户端和/或服务器端的JSON对象.

该AWS文档显示该怎么办.

if (event.body !== null && event.body !== undefined) {
    let body = JSON.parse(event.body)
    if (body.time) 
        time = body.time;
}
...
var response = {
    statusCode: responseCode,
    headers: {
        "x-custom-header" : "my custom header value"
    },
    body: JSON.stringify(responseBody)
};
console.log("response: " + JSON.stringify(response))
callback(null, response);

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有