如何在 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
。
在 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
。