【问题标题】:How to send parameters through AWS HTTP API to Lambda如何通过 AWS HTTP API 向 Lambda 发送参数
【发布时间】:2020-12-29 12:42:05
【问题描述】:

出于成本效益考虑,我已从 REST API 切换到 HTTP API。我是 AWS 的菜鸟,所以请耐心等待。

拉姆达

我有一个简单的 Lambda 函数,它返回给定的相同值。从实际的 Lambda 控制台测试时,它工作正常。

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: "hello" + event["key1"]
    };
    return response;
};

在使用 JSON 输入从 Lambda 控制台测试函数时: { "key1":"value1" },它返回 "hellovalue1"。 这就是我希望我的 GET/POST 请求返回的内容。

API 网关(HTTP API)

我创建了一个简单的 HTTP API,它导致上面的 lambda 函数。 https://39lzilxqm2.execute-api.eu-central-1.amazonaws.com/MS_APITest

当从浏览器调用上面的链接时,它返回helloundefined

我假设传递参数的方式是 [THE LINK ABOVE]?key1=value1,但这也返回 helloundefined

当使用其他在线工具通过GET/POST请求将JSON数据发送到上面的链接时,结果又是helloundefined

荣誉奖:通过邮递员发送请求时,显示错误:

CORS 错误:由于 CORS 政策,请求已被阻止

如何使用 HTTP API 将参数传递给 AWS Lambda?

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

    我尝试使用 HTTP API 复制该问题。我注意到该事件具有以下形式。

    {
      version: '2.0',
      routeKey: 'ANY /MS_APITest',
      rawPath: '/MS_APITest',
      rawQueryString: 'key1=value1',
      headers: {
        accept: '*/*',
        'content-length': '0',
        host: 'xxxxx.execute-api.us-east-1.amazonaws.com',
        'user-agent': 'curl/7.72.0',
        'x-amzn-trace-id': 'Root=1-5f5afd55-332693f425fbcc7a032809da',
        'x-forwarded-for': 'xxxxxxxxx',
        'x-forwarded-port': '443',
        'x-forwarded-proto': 'https'
      },
      queryStringParameters: { key1: 'value1' },
      requestContext: {
        accountId: '820872329501',
        apiId: 'sg5mhha5ic',
        domainName: 'xxxx.execute-api.us-east-1.amazonaws.com',
        domainPrefix: 'sg5mhha5ic',
        http: {
          method: 'GET',
          path: '/MS_APITest',
          protocol: 'HTTP/1.1',
          sourceIp: 'xxxxxx',
          userAgent: 'curl/7.72.0'
        },
        requestId: 'SryFYjtUIAMEV5w=',
        routeKey: 'ANY /MS_APITest',
        stage: '$default',
        time: '11/Sep/2020:04:30:13 +0000',
        timeEpoch: 1599798613551
      },
      isBase64Encoded: false
    }
    

    可以看出?key1=value1被传递为

    queryStringParameters: { key1: 'value1' },
    

    因此,lambda函数应该是:

    exports.handler = async (event) => {
        // TODO implement
        console.log(event)
        const response = {
            statusCode: 200,
            body: "hello" + event['queryStringParameters']["key1"]
        };
        return response;
    };
    

    验证它可以使用:

    curl https://xxxx.execute-api.us-east-1.amazonaws.com/MS_APITest?key1=value1
    

    导致:

    hellovalue1
    

    【讨论】:

    • 这很有魅力!你解决了问题,应该获得金牌。你的回复以难以想象的规模帮助了我。谢谢!
    【解决方案2】:

    这将取决于您的 api 网关配置是否正确地将某些内容 - 查询参数、POST 或 PUT 正文(注意 GET 请求正文被忽略)、表单数据 - 映射到您的 lambda 的 Json 输入。仔细查看https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html - 注意如何

    整个请求通过代表任何 HTTP 方法的全能 ANY 方法按原样发送到后端 Lambda 函数。实际的 HTTP 方法由客户端在运行时指定。 ANY 方法允许您为所有受支持的 HTTP 方法使用单个 API 方法设置:DELETE、GET、HEAD、OPTIONS、PATCH、POST 和 PUT。

    后来他们展示了如何

    curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle" -H "content-type: application/json" -H "day: Thursday" -d "{ \"time\": \"evening\" }"
    

    或者,对于 GET 请求,

    curl -X GET \
      'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle' \
      -H 'content-type: application/json' \
      -H 'day: Thursday'
    

    所有内容都在此处提供的包罗万象的配置中捕获。

    但是,如果该集成不完全正确,则数据将无法正确传递,因此请仔细查看。

    【讨论】:

    • 您好,我只是想知道。提供的链接适用于 REST API。它是否也适用于 HTTP API?似乎 OP 想在 API Gateway 中使用 Lambda 和 HTTP API,而不是 REST API。
    • 没错,REST API 有大量关于如何使用和配置它们的文档。几乎没有关于 HTTP API 以及如何设置它们的文档。我一直在寻找映射选项,但一无所获。这就是困扰我的地方。
    • @Ziphold HTTP API 是相当新的并且非常有限。这解释了它较低的价格和缺乏资源和教程:-(
    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2018-01-15
    • 2015-10-21
    • 2018-09-26
    • 2021-08-28
    • 2019-09-28
    相关资源
    最近更新 更多