Возвращать разные типы MIME на основе параметра заголовка Accept на Amazon AWS API Gateway
Не могли бы вы объяснить, как настроить Amazon AWS API Gateway так, чтобы он возвращал разные документы на основе запроса HTTP Accept header?
Два примера:
curl - запрос GET ' http://api.sample.com/v1/hello' --header 'Принять: текст /HTML'
Привет, мир! body> html>
curl - запрос GET ' http://api.sample.com/v1/hello' --header 'Принять: application / JSON'
{данные:"Привет, мир!"}
1 ответ
Если вы хотите, чтобы API-шлюз действовал как механизм рендеринга шаблонов, я не думаю, что это сработает, но вы можете сообщить своей лямбде, какой тип контента ищет запрашивающий, передав заголовок Accept вашей лямбде, и пусть Lambda решит, что делать. вернуть.
Вам потребуется шаблон сопоставления (в разделе "Выполнение метода" -> "Запрос на интеграцию" -> "Шаблоны сопоставления") для каждого типа контента (данных, отправляемых запрашивающей стороной), которые вы хотите поддерживать.
Пример шаблона сопоставления, который принимает входные данные из запроса и преобразует их в JSON event
так что лямбда может с этим работать:
{
"headers": {
// maybe there is an easier way for Lambda to get this but I couldn't find it in the context object so I believe APIG needs to send it like this
"Accept": "$input.params('Accept')"
},
"message": "$input.params('message')"
}
Затем в своей лямбде вы можете проверить заголовок Accept и отправить ответ на основании этого:
module.exports.handler = function(event, context) {
var msg = event.message.toUpperCase()
if(event.headers.Accept === 'text/html') {
return context.succeed('<html><body><h1>Transformed Message: ' + msg + '</h1></body></html>');
}
// all other requests get JSON...
context.succeed({transformedMessage: msg});
};
И последний шаг обратно в API-шлюз - в разделе Выполнение метода -> ОТВЕТ на метод -> Добавить ответ. Модель может быть просто пустой, но установите для Content-Type значение text/html
, Это сообщит API-шлюзу о том, что все, что вы отправляете обратно из Lambda, будет проходить через любые запросы, где Accept: text/html
РЕДАКТИРОВАТЬ: Этот ответ предполагал, что вы используете Lambda в качестве бэкэнда, но на самом деле ту же идею можно применить практически к любому бэкэнд-сервису, который вы используете.