如何在 AWS Lambda 中获取 HTTP 方法?

How to get the HTTP method in AWS Lambda?

在 AWS Lambda 代码中,如何获取来自 AWS 网关 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 总是空的

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

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

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

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

以下是如何在 API 网关控制台中添加它的屏幕截图:

导航至 AWS 控制台 > API 网关 >(select 资源,IE - GET /home)> 集成请求 > 映射模板 > 然后单击 application/json和 select 上面屏幕截图中显示的下拉菜单中的方法请求直通

我在从函数创建模板 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)))

我更改了代码:

operation = event['httpMethod']

operation = event['requestContext']['http']['method']

如何获得此解决方案?

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

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