У меня есть настройка конечной точки шлюза 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.