如何在 lambda 函数中传递和检索多个参数?
How to pass and retrieve multiple parameters in lambda function?
我目前正在使用带有 python 和 dynamoDB 的无服务器框架开发 REST API。我想知道如何在我的 lambda 函数中传递和检索参数。我在 serverless.xml
上的配置如下:
getNearestConvenios:
handler: src/controllers/convenio_controller.get_nearest_convenios
events:
- http:
path: convenios/nearest
method: get
cors: True
request:
template:
application/json: '{ "lat" : "$input.params(''lat'')", "long" : "$input.params(''long'')"}'
我正在尝试检索这样的参数:
def get_nearest_convenios(event, context):
try:
parameters = event['pathParameters']
convenios = service.get_nearest_convenios(parameters['lat'], parameters['long'])
return http.ok(convenios)
except Exception as ex:
logger.warn("WARNING: Request id: {0}, Error: {1}, Info: {2}".format(context.aws_request_id, type(ex), ex.args))
return http.bad_request(str(ex))
我按照官方文档中提供的Custom Request Templates进行了操作,但是一直没有成功。此外,在 CloudWatch 中显示以下错误:
[WARNING] 2020-08-14T09:04:11.783Z 3c9222b2-4601-4460-ba7c-3cd89ba3b04b WARNING: Request id: 3c9222b2-4601-4460-ba7c-3cd89ba3b04b, Error: <class 'TypeError'>, Info: ("'NoneType' object is not subscriptable",)
您尚未在 lambda 中指定任何集成类型,因此它将使用默认的 lambda-proxy
集成类型。在 Lambda 代理集成中,当客户端提交 API 请求时,API 网关将原始请求 as-is 传递给集成的 Lambda 函数。您不能将映射模板与 lambda-proxy
集成一起使用。如果您想转换您的请求或响应,您可以选择没有代理的 lambda 集成。
您正在使用 HTTP GET。因此,您可以将数据作为查询字符串或路径参数传递。
查询字符串:您传递url中的数据,例如http://api.example.com/Books?id=1。可以在 lambda 内部访问查询字符串参数,如 event. queryStringParameters
路径参数:您可以在您的无服务器模板中定义一个参数,如下所示。然后您可以访问 lambda 中的路径参数,例如 event.pathParameters
getNearestConvenios:
handler: src/controllers/convenio_controller.get_nearest_convenios/{parameter}
events:
- http:
path: convenios/nearest
method: get
cors: True
我目前正在使用带有 python 和 dynamoDB 的无服务器框架开发 REST API。我想知道如何在我的 lambda 函数中传递和检索参数。我在 serverless.xml
上的配置如下:
getNearestConvenios:
handler: src/controllers/convenio_controller.get_nearest_convenios
events:
- http:
path: convenios/nearest
method: get
cors: True
request:
template:
application/json: '{ "lat" : "$input.params(''lat'')", "long" : "$input.params(''long'')"}'
我正在尝试检索这样的参数:
def get_nearest_convenios(event, context):
try:
parameters = event['pathParameters']
convenios = service.get_nearest_convenios(parameters['lat'], parameters['long'])
return http.ok(convenios)
except Exception as ex:
logger.warn("WARNING: Request id: {0}, Error: {1}, Info: {2}".format(context.aws_request_id, type(ex), ex.args))
return http.bad_request(str(ex))
我按照官方文档中提供的Custom Request Templates进行了操作,但是一直没有成功。此外,在 CloudWatch 中显示以下错误:
[WARNING] 2020-08-14T09:04:11.783Z 3c9222b2-4601-4460-ba7c-3cd89ba3b04b WARNING: Request id: 3c9222b2-4601-4460-ba7c-3cd89ba3b04b, Error: <class 'TypeError'>, Info: ("'NoneType' object is not subscriptable",)
您尚未在 lambda 中指定任何集成类型,因此它将使用默认的 lambda-proxy
集成类型。在 Lambda 代理集成中,当客户端提交 API 请求时,API 网关将原始请求 as-is 传递给集成的 Lambda 函数。您不能将映射模板与 lambda-proxy
集成一起使用。如果您想转换您的请求或响应,您可以选择没有代理的 lambda 集成。
您正在使用 HTTP GET。因此,您可以将数据作为查询字符串或路径参数传递。
查询字符串:您传递url中的数据,例如http://api.example.com/Books?id=1。可以在 lambda 内部访问查询字符串参数,如
event. queryStringParameters
路径参数:您可以在您的无服务器模板中定义一个参数,如下所示。然后您可以访问 lambda 中的路径参数,例如
event.pathParameters
getNearestConvenios: handler: src/controllers/convenio_controller.get_nearest_convenios/{parameter} events: - http: path: convenios/nearest method: get cors: True