AWS API Gateway не применяет шаблон сопоставления к запросу DELETE с пустым телом

У меня есть настройка конечной точки шлюза API, подключенная к функции Lambda. Я настроил шаблон сопоставления для интеграции между моей конечной точкой и моей лямбда-функцией, который выглядит следующим образом:

{  
   "httpMethod":"$context.httpMethod",
   "body":"$input.json('$')",
   "queryParams":"$input.params().querystring",
   "headerParams":"$input.params().header",
   "headerParamNames":"$input.params().header.keySet()",
   "contentTypeValue":"$input.params().header.get('Content-Type')",
   "cognitoIdentityId":"$context.identity.cognitoIdentityId",
   "cognitoIdentityPoolId":"$context.identity.cognitoIdentityPoolId",
   "id":"$input.params('id')"
}

Я установил /{id} путь, который поддерживает GET и DELETE, оба из которых имеют настроенный выше шаблон сопоставления.

Когда я делаю запрос GET, я вижу в своих журналах CloudWatch, что шлюз API получает нулевое тело запроса, обрабатывает мое сопоставление и отправляет преобразованное тело запроса в мою лямбду со всей заполненной ожидаемой информацией.

Method request body before transformations: null
....
Endpoint request body after transformations: {"httpMethod":"GET","body":{},"queryParams":"{}","headerParams":"{....

Когда я делаю запрос DELETE к тому же ресурсу, я вижу другое поведение:

Method request body before transformations: null
....
Endpoint request body after transformations: null

Таким образом, похоже, что есть проблема с частью DELETE шлюза API, заключающаяся в том, что он не может обрабатывать пустое тело (пустое тело в запросе DELETE должно быть действительным в соответствии со спецификацией HTTP).

Кажется, все работает нормально, если я передаю пустое тело в DELETE (например, установите тело в {}). Однако SDK API Gateway JavaScript не может передать пустой объект JSON; если я передаю сгенерированному методу удаления пустое тело, он просто устанавливает для тела запроса DELETE значение null вместо пустого объекта JSON.


person Mason    schedule 12.03.2016    source источник


Ответы (1)


Не могли бы вы передать пустое тело в строковом формате ("{}")? Вы можете попробовать использовать cURL для тестирования вашего API. Иногда вам может потребоваться передать Content-Type в заголовке.

Надеюсь, это поможет вам отладить ваш API.

person Ka Hou Ieong    schedule 13.03.2016
comment
Apig.subscriptionsIdDelete({id: this.subscription.id}, "{}") Невероятно, но это действительно работает ....: | - person user2976753; 07.08.2016