【问题标题】:How to get the HTTP method in AWS Lambda?如何在 AWS Lambda 中获取 HTTP 方法?
【发布时间】:2021-11-23 23:59:38
【问题描述】:

在 AWS Lambda 代码中,如何获取来自 AWS Gateway API 的 HTTP 请求的 HTTP 方法(例如 GET、POST...)?

我从documentation 了解到 context.httpMethod 是解决方案。

但是,我无法让它工作。

例如,当我尝试添加以下 3 行时:

    if (context.httpMethod) {
            console.log('HTTP method:', context.httpMethod)
    }

进入“microservice-http-endpoint”蓝图的AWS示例代码如下:

exports.handler = function(event, context) {

    if (context.httpMethod) {
        console.log('HTTP method:', context.httpMethod)
    }

    console.log('Received event:', JSON.stringify(event, null, 2));

    // For clarity, I have removed the remaining part of the sample
    // provided by AWS, which works well, for instance when triggered 
    // with Postman through the API Gateway as an intermediary.
};

我在日志中从来没有任何内容,因为 httpMethod 始终为空

【问题讨论】:

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


    【解决方案1】:

    context.httpMethod 方法仅适用于模板。因此,如果您想在您的 Lambda 函数中访问 HTTP 方法,您需要在 API 网关中找到该方法(例如 GET),转到 Integration Request 部分,点击 映射模板,并为application/json 添加一个新的映射模板。然后,选择application/json 并选择映射模板,然后在编辑框中输入如下内容:

    {
        "http_method": "$context.httpMethod"
    }
    

    然后,当您的 Lambda 函数被调用时,您应该会在传入的 event 中看到一个名为 http_method 的新属性,其中包含用于调用该函数的 HTTP 方法。

    【讨论】:

    • 谢谢。顺便说一句,您的答案中只是一个小错字:""$context.httpMethod""$context.httpMethod"
    • Chrome 扩展高级 REST 客户端对你们有用吗?我使用它时上下文变量为 null,但它适用于扩展 Postman 和 DHC,或者如果它是 GET 端点,则直接在浏览器中调用。
    • 确保在进行这些更改后重新部署端点。我花了最长时间才弄清楚。
    【解决方案2】:

    API Gateway 现在有一个内置的映射模板,可以传递 http 方法、路由等内容。我无法嵌入,因为我没有足够的积分,但你明白了。

    这是您如何在 API Gateway 控制台中添加它的屏幕截图:

    要到达那里,导航到 AWS 控制台 > API 网关 >(选择资源,IE - GET /home)> 集成请求 > 映射模板 > 然后单击 application/json 并从上面屏幕截图所示的下拉列表中选择 Method Request Passthrough

    【讨论】:

    • 文字可搜索,图片不可搜索。 Windows 错误屏幕也不能复制粘贴,但将消息作为文本有助于找到正在搜索的内容。
    • idownvotedbecau.se/imageofcode 列出了人们认为粘贴文本图像而不是文本本身时值得投反对票的原因。
    • 这里的重点不是显示代码,而是向用户展示 AWS API Gateway 控制台中面板的外观。
    • 这是更好的答案。即使接受的答案是正确的,它也会替换信息而不是添加/注释,这更有可能是问题的意图
    【解决方案3】:

    当我从函数创建模板 microservice-http-endpoint-python 项目时遇到了这个问题。 因为它创建了一个 HTTP API 网关,并且只有 REST API 有Mapping template,所以我无法完成这项工作。只修改 Lambda 的代码。

    基本上,代码也是这样,但我没有使用事件['httpMethod']

    请检查:

    import boto3
    import json
    
    print('Loading function')
    dynamo = boto3.client('dynamodb')
    
    
    def respond(err, res=None):
        return {
            'statusCode': '400' if err else '200',
            'body': err.message if err else json.dumps(res),
            'headers': {
                'Content-Type': 'application/json',
            },
        }
    
    
    def lambda_handler(event, context):
        '''Demonstrates a simple HTTP endpoint using API Gateway. You have full
        access to the request and response payload, including headers and
        status code.
    
        To scan a DynamoDB table, make a GET request with the TableName as a
        query string parameter. To put, update, or delete an item, make a POST,
        PUT, or DELETE request respectively, passing in the payload to the
        DynamoDB API as a JSON body.
        '''
        print("Received event: " + json.dumps(event, indent=2))
    
        operations = {
            'DELETE': lambda dynamo, x: dynamo.delete_item(**x),
            'GET': lambda dynamo, x: dynamo.scan(**x),
            'POST': lambda dynamo, x: dynamo.put_item(**x),
            'PUT': lambda dynamo, x: dynamo.update_item(**x),
        }
        
        operation =  event['requestContext']['http']['method']
    
        if operation in operations:
            payload = event['queryStringParameters'] if operation == 'GET' else json.loads(event['body'])
            return respond(None, operations[operation](dynamo, payload))
        else:
            return respond(ValueError('Unsupported method "{}"'.format(operation)))
    

    我将代码更改为:

    操作 = 事件['httpMethod']

    操作 = 事件['requestContext']['http']['method']

    如何获得此解决方案?

    我只是返回了整个事件,检查了 JSON 并以正确的格式将其投入使用。

    【讨论】:

    • 谢谢。对于那些使用 Node.js 运行时的人,可以类似地完成:let operation = event.requestContext.http.method;
    • @jorge freitas 我觉得这行不通了,我试过了,现在好像是event['requestContext']['httpMethod']
    【解决方案4】:

    如果event 显示为空对象,请确保您为该方法启用了代理集成。 HTTP 方法的代理集成将请求信息添加到event。 请参阅 API 网关页面上的 Use Lambda Proxy integration

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 2017-01-16
      • 2015-07-07
      • 2019-06-23
      • 1970-01-01
      • 2018-08-28
      相关资源
      最近更新 更多