Как передать и извлечь несколько параметров в лямбда-функции?

#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», и это сработало просто отлично! 🙂