Как передать параметр запроса или маршрута в AWS Lambda из Amazon API Gateway
например, если мы хотим использовать
GET /user?name=bob
или
GET /user/bob
Как бы вы передали оба этих примера в качестве параметра для функции лямбда?
Я видел что-то о настройке "сопоставленного" в документации, но я не могу найти этот параметр в консоли API-шлюза.
-
method.request.path.parameter-name
для параметра пути с именем parameter-name
, как определено на странице запроса метода.
-
method.request.querystring.parameter-name
для параметра строки запроса с именем parameter-name
, как определено на странице запроса метода.
Я не вижу ни одного из этих параметров, даже если я определил строку запроса.
Ответы
Ответ 1
По состоянию на сентябрь 2017 года вам больше не нужно настраивать сопоставления для доступа к телу запроса.
Все, что вам нужно сделать, это проверить "Использовать интеграцию с Lambda Proxy" в разделе "Запрос интеграции" под ресурсом.
![введите описание изображения здесь]()
После этого вы сможете получить доступ к параметрам запроса, параметрам пути и заголовкам
event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']
Ответ 2
Для этого выполните следующие шаги:
В консоли API Gateway...
- перейти к
Resources -> Integration Request
- щелкните значок "плюс" или "Правка" рядом с выпадающим списком шаблонов (нечетное я знаю, так как поле шаблона уже открыто и кнопка здесь выглядит серым)
- Явно введите
application/json
в поле типа содержимого, даже если оно показывает значение по умолчанию (если вы этого не сделаете, оно не будет сохранено и не даст вам сообщение об ошибке)
-
поместите это во входное сопоставление { "name": "$input.params('name')" }
-
установите флажок рядом с раскрывающимся списком шаблонов (я предполагаю, что это то, что в конечном итоге сохраняет его)
Ответ 3
Я использовал этот шаблон сопоставления, чтобы предоставить тегам Body, Headers, Method, Path и URL Query String Parameters для события 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
}
}
Ответ 4
В наши дни раскрывающийся шаблон включен в консоль API Gateway на AWS.
Для вашего API щелкните имя ресурса... затем GET
Разверните "Шаблоны сопоставления тела"
Введите
приложения/JSON
для Content-Type (должен быть явно указан) и нажмите галочку
Откроется новое окно со словами "Сгенерировать шаблон" и выпадающим меню (см. изображение).
Выберите
Запрос запроса метода
![введите описание изображения здесь]()
Затем нажмите "Сохранить"
Чтобы получить доступ к любым переменным, просто используйте следующий синтаксис (это 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'])
Таким образом, нет необходимости явно указывать или сопоставлять каждую желаемую переменную.
Ответ 5
Принятый ответ сработал у меня, но, расширяя ответ на 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
}
Ответ 6
Чтобы передать параметры в вашу лямбда-функцию, вам нужно создать отображение между запросом API-шлюза и вашей лямбда-функцией. Сопоставление выполняется в разделе Integration Request
→ Mapping templates
выбранного ресурса шлюза API.
Создайте отображение типа application/json
, затем справа вы отредактируете (щелкните карандашом) шаблон.
Шаблон отображения на самом деле является шаблоном Velocity, где вы можете использовать ifs, циклы и, конечно, печатать переменные на нем. В шаблон вводятся эти переменные, где вы можете получить доступ к параметрам строки запроса, заголовкам запроса и т.д. По отдельности. С помощью следующего кода вы можете заново создать всю строку запроса:
{
"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('$')
}
Примечание: нажмите на значок галочки, чтобы сохранить шаблон. Вы можете проверить свои изменения с помощью кнопки "Тест" на вашем ресурсе. Но чтобы протестировать параметры строки запроса в консоли AWS, вам необходимо определить имена параметров в разделе " Method Request
" вашего ресурса.
Примечание: обратитесь к Руководству пользователя Velocity для получения дополнительной информации о языке шаблонов Velocity.
Затем в вашем лямбда-шаблоне вы можете сделать следующее для анализа строки запроса:
var query = require('querystring').parse(event.querystring)
// access parameters with query['foo'] or query.foo
Ответ 7
В рамках попытки ответить на один из моих собственных вопросов здесь я наткнулся на этот трюк.
В шаблоне сопоставления шлюза API используйте следующее, чтобы предоставить вам полную строку запроса, отправленную клиентом HTTP:
{
"querystring": "$input.params().querystring"
}
Преимущество состоит в том, что вам не нужно ограничивать себя набором предопределенных сопоставленных ключей в строке запроса. Теперь вы можете принимать любые пары ключ-значение в строке запроса, если это то, как вы хотите обрабатывать.
Примечание. В соответствии с this, только $input.params(x)
отображается как переменная, доступная для шаблона VTL. Возможно, внутренние изменения могут измениться, и querystring
может быть недоступен.
Ответ 8
Теперь вы можете использовать новый тип интеграции прокси для 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
Ответ 9
Многие ответы здесь замечательные. Но я хотел кое-что немного проще.
Я хотел что-то, что будет работать с образцом "Hello World" бесплатно. Это означает, что я хотел, чтобы простой создавал тело запроса, которое соответствует строке запроса:
{
#foreach($param in $input.params().querystring.keySet())
"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
}
Я думаю, что лучший ответ создает что-то более полезное при создании чего-то реального, но для того, чтобы получить быстрый мир привет, использующий шаблон из AWS, это отлично работает.
Ответ 10
Следующий пример сопоставления параметров передает все параметры, включая путь, последовательность запросов и заголовок, до конечной точки интеграции через полезную нагрузку 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",
...
}
}
}
Скопировано из Руководство разработчика API-интерфейса Amazon API
Ответ 11
GET/user? name = bob
{
"name": "$input.params().querystring.get('name')"
}
GET/user/bob
{
"name": "$input.params('name')"
}
Ответ 12
Строка запроса прямо обрабатывается в javascript в lambda
для GET/user? name = bob
var name = event.params.querystring.name;
Это не решает вопрос GET пользователя/bob.
Ответ 13
Функция Lambda ожидает ввод данных в формате JSON, поэтому необходимо выполнить синтаксический анализ строки запроса. Решение состоит в том, чтобы изменить строку запроса на JSON с помощью шаблона отображения.
Я использовал его для С#.NET Core, поэтому ожидаемым вводом должен быть JSON с параметром "queryStringParameters".
Для этого выполните следующие 4 шага:
- Откройте шаблон сопоставления вашего ресурса API Gateway и добавьте новое
application/json
content-tyap:
![API Gateway mapping template]()
-
Скопируйте шаблон ниже, который анализирует строку запроса в JSON, и вставьте ее в шаблон отображения:
{
"queryStringParameters": {#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0),#end"$key":"$input.params().querystring.get($key)"#end}
}
-
В шлюзе API вызовите функцию Lambda и добавьте следующую строку запроса (для примера): param1=111¶m2=222¶m3=333
-
Шаблон сопоставления должен создать вывод JSON ниже, который является вводом для вашей лямбда-функции.
{
"queryStringParameters": {"param3":"333","param1":"111","param2":"222"}
}
-
Вы сделали С этого момента ваша логика функции Lambda может использовать параметры строки запроса.
Удачи!
Ответ 14
Вы можете использовать Lambda в качестве "Lambda Proxy Integration", см. Этот [ https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda. html # api-gateway-proxy -gration -lambda-function-python], доступные для этой лямбды опции:
Для Nodejs Lambda "event.headers", "event.pathParameters", "event.body", "event.stageVariables" и "event.requestContext"
Для события Python Lambda ['headers'] ['имя_параметра'] и т.д.
Ответ 15
Как отвечает @Jonathan, после отметки " Использовать интеграцию Lambda Proxy в запросе на интеграцию" в исходном коде необходимо реализовать следующий формат, чтобы пропустить ошибку 502 Bad Gateway.
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;
};
Не забудьте развернуть свой ресурс в API Gateway, прежде чем перезапускать свой API. Ответ JSON просто вернет, какой набор в теле корректен. Таким образом, вы можете получить путь, параметр, заголовки, значение тела из события
const {path, queryStringParameters, headers, body} = событие;
Ответ 16
Прочитав несколько из этих ответов, я использовал комбинацию из нескольких в августе 2018 года для получения параметров строки запроса через лямбду для python 3.6.
Сначала я зашёл в API Gateway → Мой API → ресурсы (слева) → Запрос на интеграцию. Внизу внизу выберите Mapping Templates, затем для типа контента введите application/json
.
Затем выберите шаблон "Метод запроса", который предоставляет Amazon, и выберите "Сохранить и развернуть API".
Затем в лямбда- event['params']
вы получаете доступ ко всем своим параметрам. Для строки запроса: event['params']['querystring']
Ответ 17
Если вы используете JAVA для своих функций Lambda, вы можете использовать Lambada Framework, который позаботится об этом для вас.