#python #amazon-web-services #aws-lambda #serverless-framework #aws-serverless
#python #amazon-веб-сервисы #aws-lambda #бессерверный фреймворк #aws-бессерверный
Вопрос:
В настоящее время я разрабатываю REST API, используя бессерверную платформу с python и DynamoDB. Я хотел бы знать, как я могу передавать и извлекать параметры в моей лямбда-функции. Моя конфигурация на 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))
Я следовал пользовательским шаблонам запросов, предоставленным в официальной документации, но до сих пор у меня не было успеха. Кроме того, в 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",)
Ответ №1:
вы не указали какой-либо тип интеграции в вашем lambda, поэтому он будет использовать lambda-proxy
тип интеграции по умолчанию. При интеграции с лямбда-прокси, когда клиент отправляет запрос API, API Gateway передает встроенной лямбда-функции необработанный запрос как есть. Вы не можете использовать шаблоны сопоставления с lambda-proxy
интеграцией. Если вы хотите преобразовать свой запрос или ответ, вы можете выбрать интеграцию с lambda без прокси.
Вы используете HTTP GET. Поэтому вы можете передавать данные в виде строки запроса или параметров пути.
-
Строка запроса: вы передаете данные в URL, напримерhttp://api.example.com/Books?id=1. Параметры строки запроса могут быть доступны внутри лямбда-функции как
event. queryStringParameters
-
Параметры пути: вы можете определить параметр в вашем бессерверном шаблоне, как показано ниже. затем вы можете получить доступ к параметрам пути внутри лямбда-функции следующим образом
event.pathParameters
getNearestConvenios: handler: src/controllers/convenio_controller.get_nearest_convenios/{parameter} events: - http: path: convenios/nearest method: get cors: True
Ссылка:
Интеграция с лямбда-прокси
Комментарии:
1. Большое вам спасибо! Я удалил реализацию шаблонов сопоставления и внутри функции «get_nearest_convenios» я изменил ключ «pathParameters» на «queryStringParameters», и это сработало просто отлично! 🙂