Может ли шаблон сопоставления для шлюза API иметь как динамические, так и жестко заданные значения

Я пытаюсь сопоставить запрос шлюза API с лямбда-выражением. Я использую шаблон сопоставления

{
  "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
  },
  "source_ip" : "$context.identity.sourceIp"
}

Проблема в том, что я также хотел бы жестко закодировать параметр строки запроса, который пользователь не должен передавать (по причинам, связанным с пользовательским интерфейсом), но моя лямбда ожидает. Я бы хотел сделать что-то подобное

{
   “queryParams” : 
      “myrequiredkey” : “foo” }
}

}

Однако когда я пытаюсь объединить эти два шаблона, в результате я всегда перезаписываю все queryParams, а лямбда-выражение получает в своем событии {"queryParams": "foo"}}. Но я также хочу, чтобы ему отправлялись любые другие параметры запроса. Есть ли способ добавить жестко запрограммированный параметр запроса и не переопределить все динамически сопоставленные параметры?

Спасибо!


person SGolds    schedule 23.04.2020    source источник


Ответы (1)


Что насчет этого :

{
  "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))",
    #end
    "myrequiredkey":"foo"
  },
  "pathParams": {
    #foreach($param in $input.params().path.keySet())
    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end
    #end
  },
  "source_ip" : "$context.identity.sourceIp"
}

Я удалил #if($foreach.hasNext),#end и прямо поместил требуемый параметр в ваш объект.

person BTL    schedule 23.04.2020
comment
Спасибо за ответ @BTL! Я собираюсь попробовать это. Просто интересно, как вы думаете, каким было бы решение, если бы я использовал проход сопоставления запросов, который предоставляет aws? (В своем шаблоне они динамически создают объекты, включая строку запроса) - person SGolds; 23.04.2020
comment
Принимаю ответ, поскольку он работает отлично и точно отвечает на мой исходный вопрос - person SGolds; 23.04.2020
comment
Пожалуйста ! Отвечая на ваш комментарий, я не уверен. Мне было бы труднее ... Что ж, я думаю, что твой способ сделать это достаточно хорош. - person BTL; 23.04.2020