2016-10-20 4 views
3

Я рассмотрел другие связанные вопросы по SO, но это кажется другим. На самом деле, мой вопрос очень похож на this one, за исключением того, что у меня нет проблемы с статусом 400.AWS API Gateway CORS ok для ОПЦИЙ, сбой для POST

настроенный:

  • лямбда-функции через API шлюза
  • Авторизация: Нет, ключ API Требуется: ложные
  • развертывания на этапе: тест

  • 1 ресурс, 1 POST метод интеграции лямбда.

  • Вызов конечной точки POST непосредственно, например. с curl всегда возвращает 200 (с/без полезной нагрузки, плохая полезная нагрузка и т. д.) - так что это отличается от упомянутого вопроса.

Я использовал параметр «Включить CORS» - я пробовал применить эту опцию как к ресурсу, так и к запросу POST (и затем развертывать API).

В API GW я могу видеть Access-Control-Allow-Origin, перечисленные в 200 Ответных заголовках по методу POST - область ответа метода.

Результат: Вызов конечной точки из кода клиента в Chrome, OPTIONS проходит, но POST не удается из-за отсутствия заголовка Access-Control-Allow-Origin.

В завитка: Парам.вызовов

curl -X OPTIONS -H "Access-Control-Request-Method: POST" \ 
    -H "Access-Control-Request-Headers: Content-Type" \ 
    -H "Origin: http://example.com" --verbose <endpoint> 

ответом является:

< HTTP/1.1 200 OK 
< Content-Type: application/json 
... 
< Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token 
< Access-Control-Allow-Methods: POST,OPTIONS 
< Access-Control-Allow-Origin: * 
... 

но с POST:

curl -X POST -d '{}' -H "Content-Type: application/json" \ 
    -H "Origin: http://example.com" --verbose <endpoint> 

возвращается:

< HTTP/1.1 200 OK 
< Content-Type: application/json 
... 

и ответное тело json - но нет Access- что-нибудь заголовка.

Что еще я могу проверить?

ответ

12

Проблема заключалась в том, что шлюз API вызвал мою функцию лямбда, используя опцию "Lambda Proxy Integration".

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

Когда внутри интерфейса API Gateway - Resource - Method отображается окно «Интеграция ответа», кажется, что нет никакого способа (даже для функции Enable CORS) добавить туда заголовок Access-Control-Allow-Origin, который согласно @Abhigna_Nagaraja необходимо.

Если вы используете «интеграцию с Lambda Proxy», добавьте заголовок 'Access-Control-Allow-Origin': '*' в свою функцию лямбда.

Еще лучше: в этом же представлении - запрос интеграции, выключить «интеграцию с Lambda Proxy» и снова включить CORS (развернуть потом).

(Тогда, в функции обратного вызова, вам придется возвращать только полезной нагрузки JSON вместо { statusCode, headers, body } объекта.)

Update:

Некоторые полезные читает, если вы не уверены, стоит ли вернуться запрос информации о статусе ответа в кодах состояния HTTP или в полезной нагрузке JSon:

http status vs json status

json status standards

+1

Я считаю, что новая «Lambda Proxy Integration» нарушена, поскольку она только создает новый ЛЮБОЙ метод. Похоже, что он не идеально интегрирован с CORS и даже с мастером запуска Lambda по умолчанию. На данный момент мне удалось это исправить, отключив «Lambda Proxy Integration» и вручную создав методы GET/POST. – alexcasalboni

+1

По моему опыту эта часть работала. ЛЮБОЙ метод - это все, что в случае LPI будет направлять все методы (POST, GET и т. Д.) На лямбда. Ошибки, если у лямбды есть какая-то проблема, все же вводят в заблуждение. – bebbi

+0

«Lambda Proxy Integration» - это способ управления кодом состояния и заголовками ответов из вашей лямбда-функции. Отключение интеграции прокси-сервера всегда будет возвращать ответ 200 и позволит вам установить только контент ответа. В документах упоминается настройка заголовка CORS внутри вашей лямбды, как требуется при использовании API GW с включенной интеграцией прокси. (Http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html) –

2

Опция «Включить CORS» - это удобный инструмент, который устанавливает все сопоставления заголовков интеграции/метода. Если вы нажали «Включить CORS», а затем добавили новый ресурс, он не будет иметь требуемых настроек. Вы можете либо нажать 'Включить CORS' еще раз или вы можете вручную установить его в качестве

  • Добавьте 'Access-Control-Allow-Origin' Метод заголовка ответа на POST методу
  • Add «Access-Control-allow- Origin 'Integration Response Header Mapping to POST method

Кроме того, не забудьте развернуть API, прежде чем тестировать изменения с помощью curl.

+0

Все было сделано по вашему выбору. Тем не менее, я отмечаю одну вещь при подтверждении с помощью шагов в ручном режиме: Method Response выглядит хорошо, но ответ Integration Response не может быть просмотрен или отредактирован. В поле указано: «Прокси-интеграция не может быть настроена для преобразования ответов». Я использую интеграцию Lambda Proxy. Может ли это быть связано с проблемой, которую я вижу? – bebbi

+0

Мне удалось получить заголовок, добавив его в раздел заголовков в обратном вызове лямбда. Поскольку это выглядит как уродливое сочетание кода и конфигурации, я подозреваю, что мы не должны использовать интеграцию Lambda Proxy при необходимости CORS? – bebbi

+0

Знаете ли вы, было ли исправлено добавление заголовка CORS в Integration Response в LPI? – bebbi

Смежные вопросы