Запрос опции не выполняется с 404 - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь отправить запрос GET из моего веб-интерфейса в приложение API. Оба работают на моей локальной машине. Вот как это построено прямо сейчас:

backend <===> frontend <=x=> API application

Все три части работают независимо друг от друга в своем собственном док-контейнере и обмениваются данными друг с другом только через HTTP-запросы.

Как показано на верхнем рисунке, соединение между backend и frontend работает нормально, но между frontend и API application - нет.

Стек состоит из:

  • frontend: сервер узла с vue-js и для запросов я использую axios
  • API application: Scala с Play Framework 2.5.14

Приложение API само по себе работает, просто найдите, когда я отправлю ей запрос через curl, как это:

curl -X GET api-application.docker/api/user?userId=1 \
-H "Authorization: key" -H "Accept: Application/Json"

Но когда я звоню из внешнего интерфейса, я получаю 404 на вызов OPTIONS. Это также дает мне предупреждение в Firefox, касающееся заголовка CORS Access-Control-Allow-Origin:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the
remote resource at http://api-application.docker:9000/api/user?userId=1
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Поэтому я сначала зашел в приложение API application.conf и добавил

play.filters.cors {
  allowedOrigins = ["*"]
}

Я также пытался обменять звездочку на http://frontend.docker:8080

Это не сработало, поэтому я снова удалил эту запись и добавил следующую строку:

play.filters.disabled += "play.filters.cors.CORSFilter"

Все еще без изменений. Теперь мне интересно, неправильно ли я понял связь между OPTIONS и CORS? Или я его неправильно выключил? Кто-нибудь может мне помочь?

EDIT: Еще кое-что, что я пробовал, ожидая ответов, но все безуспешно:

Я изменил запись в application.conf на:

play.filters.cors {
  allowedOrigins = null
}

1 Ответ

0 голосов
/ 07 мая 2018

404 при запросе OPTIONS означает, что ваш CORSFilter не включен. Поскольку вы используете Play 2.5, вы можете включить , добавив

libraryDependencies += filters 

в build.sbt и путем создания следующего app/Filters.scala файла:

import javax.inject.Inject
import play.api.http.DefaultHttpFilters
import play.filters.cors.CORSFilter

class Filters @Inject() (corsFilter: CORSFilter)
  extends DefaultHttpFilters(corsFilter)

По умолчанию все разрешено, поэтому нет необходимости изменять application.conf, пока вы не решите заблокировать доступ. Вы НЕ должны добавлять play.filters.disabled += "play.filters.cors.CORSFilter", так как это отключает поддержку CORS.

Причина, по которой ваш curl запрос работает нормально, заключается в том, что не-браузерные HTTP-клиенты не применяют политику одного и того же происхождения (см. связанный ответ SO ), поэтому CORS не применяется в случае curl.

404 по запросу OPTIONS означает, что следующий маршрут не найден:

OPTIONS api-application.docker/api/user

Браузер автоматически отправляет этот предварительный запрос перед отправкой соответствующего запроса GET. Этот маршрут OPTIONS будет автоматически обработан поддержкой CORS от Play после включения.

...