Как передать строку запроса или параметр маршрута в AWS Lambda из Amazon API Gateway


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

GET /user?name=bob

или

GET /user/bob

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

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

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

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

17 223

17 ответов:

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

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

enter image description here

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

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

действия, чтобы получить эту работу являются:

в консоли шлюза API ...

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

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

я использовал этот шаблон сопоставления для предоставления параметров строки запроса Body, Headers, Method, Path и 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

нажмите кнопку Сохранить

чтобы получить доступ к любым переменным, просто используйте следующий синтаксис (это 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" : "#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 для получения дополнительной информации о скорости шаблонизаторе.

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

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 Lambda - событие.заголовки', 'событие.pathParameters', 'событие.тело', 'событие.stageVariables', и 'событие.requestContext'

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

прочитав несколько из этих ответов, я использовал комбинацию нескольких В августе 2018 года для получения параметров строки запроса через lambda для 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;
};

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

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 ниже, который является input для лямбда-функции.

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

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