Подтвердить что ты не робот

AWS API Gateway Нет заголовка "Access-Control-Allow-Origin"

Я застрял в проблеме с шлюзом API, и я прошел через все остальные ответы SO на этом форуме AWS и прошел через их документы, но до сих пор не радуюсь.

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

Работает функция Lambda для DynamoDB. Я создал API в AWS и создал для него методы GET и OPTIONS. Я читал, что AWS не применяет OPTIONS только для GET/POST, но я получал ошибку перед полетом в моем вызове ajax, когда не было метода OPTIONS, поэтому я добавил его.

Пока только для достижения прогресса я не использую ключ API или авторизацию. Я могу успешно вызвать мой метод GET с помощью POSTMAN, который возвращает содержимое таблицы DynamoDB.

Но когда я пытаюсь использовать вызов jQuery ajax, я получаю

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

Я могу увидеть, используя инструменты Chrome dev на вкладке сети, метод OPTIONS, возвращающий статус 200, и GET возвращает статус 200, но с указанной выше ошибкой.

Я попытался включить CORS как в методах OPTIONS, так и GET, повторно развернул API после каждого изменения, попробовал следующее (http://enable-cors.org/server_awsapigateway.html), но всегда получайте ту же ошибку в консоли.

Я выполняю вызов ajax из файла на моем рабочем столе, поэтому происхождение является нулевым, поскольку страница будет развернута на S3 как одно приложение веб-страницы в JS.

Когда я включил CORS в своих GET и OPTIONS, я вижу, что Access-Control-Allow-Headers 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token' и Access-Control-Allow-Origin * is '*'

Мой вызов Ajax выглядит ниже. Я также попытался скопировать точные заголовки POSTMAN, которые имеют набор заголовков авторизации (которые я отключил в AWS сейчас), но я всегда получаю ту же ошибку выше

var awsHeaders = {};
awsHeaders['X-Amz-Date'] = '20161127T171734';

$('#add, #cloud').click(function() {

    $.ajax({

        type: 'GET',
        headers: awsHeaders,
        dataType : "json",
        url: '...',
        success: function (res) {

            console.log('response in GET:');
            console.log(res);

        },
        error: function(data) {
            console.log('in error');
            console.log(data);
        }

    });

});

Может ли кто-нибудь пролить свет на то, что мне не хватает?

Большое спасибо

Обновление См. Ответ ниже, как я решил это в соответствии с комментариями DigitalKapteain - установив заголовок "Access-Control-Allow-Origin": '*' в ответе от моей функции Lambda. Я искал это в документах AWS, но не смог найти его. Эта ссылка описывает разницу между Lambda и Lambda Proxy и объясняет, что делать при использовании CORS https://serverless.com/framework/docs/providers/aws/events/apigateway/

4b9b3361

Ответ 1

Ответ на запрос GET для функции Lambda также должен содержать заголовок Access-Control-Allow-Origin.

Ответ 3

Если это не работает для вас, убедитесь, что JSON.stringify() ваш объект json используется, если вы используете $.ajax. Если нет, вам все равно будет возвращена ошибка, которая, как утверждается, является связанной с CORS ошибкой. Но если вы отправите тот же json-объект, используя Postman, запрос будет успешным. Попробуйте...