Angular AWS заблокирован политикой CORS

Привет, я создал шлюз API AWS, который обращается к лямбда-функции.

Если я пытаюсь вызвать в шлюз из Postman, все работает нормально. Но когда я пытаюсь вызвать API-интерфейс get с помощью своего приложения Angular, я получаю следующую ошибку:

Access to XMLHttpRequest at 'apiUrl' from origin 'http://localhost:8100' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Я создаю свой Angular Request со следующим кодом:

let params = new HttpParams().set('username','[email protected]').append('password','1234');
this.http.get(apiUrl, {params}).subscribe(
res => {alert('success');},
err => {alert('fail');}
)

Я уже включил CORS в своем шлюзе API. Надеюсь, вы, ребята, поможете мне вызвать мой AWS API.

Мой текущий метод выбора выглядит следующим образом: Ответ интеграции

Каков код состояния HTTP ответа?

sideshowbarker 02.02.2019 18:04

Вы нашли решение?

riadrifai 17.05.2021 13:00
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
4
2
3 054
4

Ответы 4

Вы правильно формируете свой запрос в Angular. Проблема не имеет ничего общего с клиентской частью вашего приложения, а связана с тем, как вы настроили поддержку CORS в AWS.

Postman получает доступ к вашему API в порядке, потому что Postman не применяет политику «того же происхождения», что и веб-браузер, то есть полностью обходит CORS.

Чтобы браузер успешно выполнил запрос, API должен ответить на запрос OPTIONS в той же конечной точке с кодом возврата 200 и включить в этот ответ заголовок Access-Control-Allow-Origin, либо указывающий фактическое происхождение запроса или подстановочный знак '*'.

Документация AWS по этому поводу достаточно ясна и обширна.

Привет, я уже добавил параметры в конечную точку и включил Access-Control-Allow-Origin в заголовок (скриншот в вопросе)

juli0n_ 02.02.2019 17:57

Если бы «обширная» документация AWS по этому вопросу была хотя бы отдаленно ясной, не было бы такого количества людей, сталкивающихся с той же проблемой, которую я вижу по всему Интернету, от собственных форумов AWS до практически где угодно. Если у stackoverflow.com/users/982341/greybeardedgeek есть конкретное четкое объяснение документации AWS, может ли он сослаться на него. Я там вообще ничего внятного не нашел. Возможно, проще использовать интерфейс командной строки, но я считаю, что графический пользовательский интерфейс API Gateway в лучшем случае сбивает с толку.

user258081 29.08.2020 16:53

В шлюзе API в разделе «Ресурсы» -> «Действия». В раскрывающемся списке «Действия» есть возможность включить CORS. Проверьте, включены ли CORS и разрешены ли все источники.

Вам нужно отправить ответ от вашего API (на стороне сервера), этот ответ должен включать:

'Access-Control-Allow-Origin':'*'

Вот пример отправки ответа через Lambda(.js):

  function buildResponse(statusCode, body) {
      return {
        statusCode: statusCode,
        headers: {
          'Content-Type': 'application/json',
          'Access-Control-Allow-Origin':'*'
        },
        body: JSON.stringify(body)
      }
    }

Просто добавьте это в свой лямбда-код и вызывайте его, когда возвращаете ответ.

Подсказка: statusCode может быть 200, а тело вашего «ответа».

Ваш код в Angular в порядке.

let params = new
HttpParams().set('username','[email protected]').append('password','1234');
this.http.get(apiUrl, {params}).subscribe(
res => {alert('success');},
err => {alert('fail');}
)

Произошла ошибка при отправке заголовка.

  1. В AWS API Gateway для нужного API в меню слева выбирается вкладка Resources.
  2. Выбран метод GET
  3. В раскрывающемся меню Actions нажмите Enable CORS.
  4. В поле для Access-Control-Allow-Headers в самом конце и перед ' отделить запятой и добавить Access-Control-Allow-Origin.
  5. В поле ниже для Access-Control-Allow-Origin необходимо ввести '*'
  6. Настройте параметры кнопкой Enable CORS and replace existing CORS headers

Также добавьте заголовок GET -> Integration Request -> HTTP Headers. name — это Access-Control-Allow-Origin, а Mapped from — это '*'.

Также проверьте заголовки в Postmen. Для тестирования.

Другие вопросы по теме