2016-02-02 2 views
1

Предполагая, что маршрут, как это определено в API шлюза:Как сопоставить параметр пути, который не находится в конце пути, используя шаблон сопоставления при использовании AWS API Gateway с AWS Lambda?

POST /projects/{projectid}/key

, который отображается на AWS Lambda,

как бы один получить, что {projectid} значение в обработчике лямбда (т.е. как поле входного объекта, являющегося пользовательским классом Java)?

Насколько я понял, что-то, как это должно сделать работу: В определении API шлюза интеграции Запрос> Шаблон Mapping я добавил следующее для типа контента «приложения/JSON»:

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

Однако, даже если часть после двоеточия ($input.params('projectid), кажется, снимаемого правильно (в API журналов шлюза из CloudWatch значение выглядит, как и ожидалось), отображение не работает:. null значение достигает бэкенд

Обратите внимание, что аналогичный подход для маршрута например

GET /projects/{id} работает, как и ожидалось, с аналогичным отображением.

Похоже, что параметр path только отображается, если он последний в пути?

+0

Возможно, это только опечатка с вашей стороны, но правило шаблона сопоставления должно быть '' {"projectid": "$ input.params ('project-id')"} ''. Это должно вывести значение, связанное с '' project-id'', независимо от того, где оно находится на пути. – garnaat

+0

извините, это действительно опечатка, но только в вопросе, а не в коде/config - это projectid всюду – Ogg

+0

Хм, я не уверен, в чем проблема. Я часто использовал переменные с пути ресурса, а затем вытащил их, используя шаблоны. Кажется, не имеет значения, где они появляются на пути. Иногда у меня даже есть несколько переменных в одном пути. Я всегда мог получить к ним доступ через механизм '' $ input.params() '. – garnaat

ответ

1
  1. Проверьте обработчик Java Lambda, чтобы убедиться, что десериализация обработана правильно. Вы можете начать с простой функции NodeJS для тестирования, которая не потребует реализации RequestHandler (она будет десериализовать все в полезной нагрузке JSON без какой-либо конфигурации обработчика).

  2. Не уверен, что вы говорите об одном и том же API здесь, но вам не должно быть позволено иметь два параметра пути в одном и том же сегменте, т.е./projects/{id} и/projects/{projectid} не должны сосуществуют в одном API.

  3. Вы можете начать с использования $ input.params(), чтобы получить все ваши параметры и подтвердить, что на этой карте проецируется 'projectid'. Опять же, это было бы легче отладить в функции NodeJS.

2

Я нашел проблему. Это был не шаблон сопоставления, , а способ, которым я вызывал функцию AWS SDK. частности:

apigClient.projectsProjectidKeyPost(params, {}, {}) 

не работает - ProjectID arives null в коде лямбда.

Однако, это работает (обратите внимание на изменение 2-го значения аргумента):

apigClient.projectsProjectidKeyPost(params, '{}', {}) 

Не уверен, что именно является причиной такого поведения, хотя.

+0

Хм это интересное наблюдение. Я добавлю что-то к нашему отставанию, чтобы исследовать это поведение. Редактировать: Возможно, шаблон шаблона, который вы настроили, не был применен к запросу в первом случае. Шаблон сопоставления выбирается на основе заголовка Content-Type, поэтому вполне возможно, что в первом случае клиент не отправлял заголовок Content-Type, поскольку контент не отправлялся. –