Как передать параметр querystring или route в AWS Lambda из Amazon API Gateway

например, если мы хотим использовать

GET /user?name=bob

или

GET /user/bob

как бы вы передали оба этих примера в качестве параметра функции Lambda?

Я видел что-то о настройке "сопоставленного из" в документации, но я не могу найти этот параметр в консоли API Gateway.

  • method.request.path.parameter-name для параметра path с именем parameter-name как определено на странице запроса метода.
  • method.request.querystring.parameter-name для параметра строки запроса с именем parameter-name как определено на странице запроса метода.

Я не вижу ни одного из этих вариантов, хотя я определил строку запроса.

17 ответов


по состоянию на сентябрь 2017 года вам больше не нужно настраивать сопоставления для доступа к телу запроса.

все, что вам нужно сделать, это проверить, "использовать интеграцию лямбда-прокси", в запросе интеграции, под ресурсом.

enter image description here

затем вы сможете получить доступ к параметрам запроса, параметрам пути и заголовкам, таким как so

event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']

шаги, чтобы получить эту работу:

в консоли API Gateway ...

  1. на Resources -> Integration Request
  2. нажмите на значок "плюс" или "редактировать" рядом с раскрывающимся списком "шаблоны" (странно, я знаю, так как поле шаблона уже открыто, и кнопка здесь выглядит серой)
  3. явно типа application/json в поле content-type, даже если он показывает значение по умолчанию (если вы этого не сделаете, он не сохранит и не даст вам ошибку сообщение)
  4. поместите это во входное отображение { "name": "$input.params('name')" }

  5. нажмите на флажок рядом с раскрывающимся списком шаблонов (Я предполагаю, что это то, что, наконец, сохраняет его)


я использовал этот шаблон сопоставления для предоставления параметров строки запроса тела, заголовков, метода, пути и URL-адреса для события Lambda. Я написал сообщение в блоге, объясняющее шаблон более подробно: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api-gateway/

вот шаблон отображения, который вы можете использовать:

{
  "method": "$context.httpMethod",
  "body" : $input.json('$'),
  "headers": {
    #foreach($param in $input.params().header.keySet())
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end

    #end
  },
  "queryParams": {
    #foreach($param in $input.params().querystring.keySet())
    "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end

    #end
  },
  "pathParams": {
    #foreach($param in $input.params().path.keySet())
    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end

    #end
  }  
}

в эти дни раскрывающийся шаблон включен в консоль API Gateway на AWS.

для вашего API нажмите на имя ресурса... тогда вам

Развернуть "Шаблоны Отображения Тела"

тип

application / json

для Content-Type (должен быть явно напечатан) и нажмите галочку

откроется новое окно со словами "создать шаблон" и выпадающим списком (см. изображение.)

выберите

запрос метода passthrough

enter image description here

затем нажмите save

чтобы получить доступ к любым переменным, просто используйте следующий синтаксис (это Python) например URL:

https://yourURL.execute-api.us-west-2.amazonaws.com/prod/confirmReg?token=12345&uid=5

Вы можете получить переменные следующим образом:

from __future__ import print_function

import boto3
import json

print('Loading function')


def lambda_handler(event, context):
    print(event['params']['querystring']['token'])
    print(event['params']['querystring']['uid'])

поэтому нет необходимости явно называть или сопоставлять каждую переменную, которую вы хотите.


принятый ответ отлично работал для меня, но, расширяя ответ gimenete, я хотел общий шаблон, который я мог бы использовать для прохождения всех параметров запроса/пути/заголовка (как и строки на данный момент), и я придумал следующий шаблон. Я размещаю его здесь, Если кто-то найдет его полезным:

#set($keys = [])
#foreach($key in $input.params().querystring.keySet())
  #set($success = $keys.add($key))
#end

#foreach($key in $input.params().headers.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

#foreach($key in $input.params().path.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

{
#foreach($key in $keys)
  "$key": "$util.escapeJavaScript($input.params($key))"#if($foreach.hasNext),#end
#end
}

для передачи параметров вашей лямбда-функции вам необходимо создать сопоставление между запросом шлюза API и вашей лямбда-функцией. Отображение выполняется в Integration Request ->Mapping templates раздел выбранного ресурса шлюза API.

создать отображение типа application/json, затем справа вы будете редактировать (нажмите карандаш) шаблон.

шаблон отображения на самом деле шаблон скорости, где вы можете использовать ifs, петли и, конечно, печатать переменные на нем. Этот шаблон эти переменные вводят где вы можете получить доступ к параметрам querystring, заголовкам запросов и т. д. индивидуально. С помощью следующего кода Вы можете повторно создать всю строку запроса:

{
    "querystring" : "#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0)&#end$util.urlEncode($key)=$util.urlEncode($input.params().querystring.get($key))#end",
    "body" : $input.json('$')
}

Примечание: нажмите на символ проверки, чтобы сохранить шаблон. Вы можете проверить свои изменения с помощью кнопки "Тест" в ваш ресурс. Но для тестирования параметров querystring в консоли AWS вам нужно будет определить имена параметров в Method Request раздел вашего ресурс.

Примечание: проверьте Velocity Руководство Пользователя для получения дополнительной информации о скорости шаблонизаторе.

затем в вашем лямбда-шаблоне вы можете сделать следующее, Чтобы получить анализ строки запроса:

var query = require('querystring').parse(event.querystring)
// access parameters with query['foo'] or query.foo

в рамках попытки ответить на один из моих собственных вопросов здесь, я наткнулся на этот трюк.

в шаблоне сопоставления шлюза API используйте следующее, Чтобы получить полную строку запроса, отправленную HTTP-клиентом:

{
    "querystring": "$input.params().querystring"
}

преимущество заключается в том, что вам не нужно ограничивать себя набором предопределенных сопоставленных ключей в строке запроса. Теперь вы можете принять любые пары ключ-значение в строке запроса, если это то, как вы хотите обрабатывать.

примечание: согласно этой, только $input.params(x) отображается как переменная, доступная для шаблона VTL. Возможно, что внутренние органы могут измениться и querystring может быть больше не доступен.


теперь вы должны иметь возможность использовать новый тип интеграции прокси для Lambda для автоматического получения полного запроса в стандартной форме, а не настраивать сопоставления.

см.: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on-proxy-resource


много ответов здесь. Но мне хотелось чего-нибудь попроще. Я хотел что-то, что будет работать с образцом "Hello World" бесплатно. Это означает, что я хотел, чтобы простой создает тело запроса, которое соответствует строке запроса:

{
#foreach($param in $input.params().querystring.keySet())
  "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
}

Я думаю, что верхний ответ дает что-то более полезное при создании чего-то реального, но для быстрого запуска hello world с использованием шаблона от AWS это отлично работает.


следующий пример сопоставления параметров передает все параметры, включая путь, строку запроса и заголовок, в конечную точку интеграции через полезную нагрузку json

#set($allParams = $input.params())
{
  "params" : {
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type" : {
      #foreach($paramName in $params.keySet())
      "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
      #if($foreach.hasNext),#end
      #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}

фактически, этот шаблон отображения выводит все параметры запроса в полезной нагрузке следующим образом:

{
  "parameters" : {
     "path" : {    
       "path_name" : "path_value", 
       ...
     }
     "header" : {  
       "header_name" : "header_value",
       ...
     }
     'querystring" : {
       "querystring_name" : "querystring_value",
       ...
     }
   }
}

скопировал из руководство разработчика Amazon API Gateway


получаем /пользователей?имя=Боб

{
    "name": "$input.params().querystring.get('name')"
}

GET/user / bob

{
    "name": "$input.params('name')"
}

строка запроса прямо вперед для синтаксического анализа в javascript в лямбда

для GET / user?имя=Боб

 var name = event.params.querystring.name;

это не решает вопрос GET user/bob.


вы можете использовать лямбда-выражение в качестве "Интеграция Лямбда-Прокси", ref это [https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html#api-gateway-proxy-integration-lambda-function-python], опции, доступные для этой лямбды, являются

Для Nodejs Лямбда - событие.заголовки', 'событие.pathParameters', 'событие.тело', 'событие.stageVariables', и " событие.объекта RequestContext'

Для Python Лямбда событие ['headers'] ['parametername'] и так далее


после прочтения нескольких из этих ответов я использовал комбинацию нескольких В августе 2018 года для получения параметров строки запроса через лямбда-код для python 3.6.

во-первых, я пошел в API Gateway - > мой API - > ресурсы (слева) - > запрос на интеграцию. Внизу внизу выберите Шаблоны отображения, затем введите тип содержимогоapplication/json.

Далее выберите шаблон Passthrough запроса метода, который предоставляет Amazon, и выберите Сохранить и развернуть API.

затем в лямбда event['params'] - это способ доступа ко всем параметрам. Для строки запроса: event['params']['querystring']


как ответ @Jonathan, после mark использовать интеграцию лямбда-Прокси на Запрос На Интеграцию в исходном коде необходимо реализовать, как показано ниже формат для пропуска 502 Плохой Шлюз ошибка.

NodeJS 8.10:

exports.handler = async (event, context, callback) => {
  // TODO: You could get path, parameter, headers, body value from this
  const { path, queryStringParameters, headers, body } = event;

  const response = {
    "statusCode": 200,
    "headers": {
      "Content-Type": "application/json"
    },
    "body": JSON.stringify({
      path, 
      query: queryStringParameters,
      headers,
      body: JSON.parse(body)
    }),
    "isBase64Encoded": false
  };

  return response;
};

Не забудьте развернуть ресурс at API Gateway перед повторным запуском API. Ответ JSON просто возвращает, который установлен в тело - это правильно. Итак, вы можете получить path, параметр, заголовки, значение тела из события

const { path, queryStringParameters, headers, body } = событие;


лямбда-функция ожидает ввода JSON, поэтому необходим синтаксический анализ строки запроса. Решение состоит в том, чтобы изменить строку запроса на JSON с помощью шаблона сопоставления.
я использовал его для C# .NET Core, поэтому ожидаемым входом должен быть JSON с параметром "queryStringParameters".
выполните следующие 4 шага ниже, чтобы достичь этого:

  1. откройте шаблон отображения ресурса шлюза API и добавьте новый application/json содержание-тяп:

API Gateway mapping template

  1. скопируйте шаблон ниже, который анализирует строку запроса в JSON и вставляет ее в шаблон сопоставления:

    {
    "queryStringParameters": {#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0),#end"$key":"$input.params().querystring.get($key)"#end}
    }
    
  2. в шлюзе API вызовите свою лямбда-функцию и добавьте следующую строку запроса (например):param1=111&param2=222&param3=333

  3. шаблон сопоставления должен создать вывод JSON ниже, который является вход для лямбда-функции.

    {
    "queryStringParameters": {"param3":"333","param1":"111","param2":"222"}
    }
    
  4. ты молодец. С этого момента логика вашей лямбда-функции может использовать параметры строки запроса.
    Удачи!


Если вы используете JAVA для своих лямбда-функций, вы можете использовать Lambada Framework который заботится об этом для вас.