Мы создаем API и используем Spring RestController
и Spring HATEOAS
.
Когда файл войны развертывается в контейнере и запрос GET делается на http://localhost:8080/placesapi-packaged-war-1.0.0-SNAPSHOT/places
, ссылки HATEOAS выглядят следующим образом:
{
"links" : [ {
"rel" : "self",
"href" : "http://localhost:8080/placesapi-packaged-war-1.0.0-SNAPSHOT/places",
"lastModified" : "292269055-12-02T16:47:04Z"
} ]
}
в том, что веб-контекст представляет собой развернутое приложение (например: placesapi-packaged-war-1.0.0-SNAPSHOT
)
В реальной среде выполнения (UAT и далее) контейнер, скорее всего, будет находиться за http-сервером, например Apache
, где виртуальный хост или аналогичный фронт веб-приложения. Что-то вроде этого:
<VirtualHost Nathans-MacBook-Pro.local>
ServerName Nathans-MacBook-Pro.local
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
ProxyPass / ajp://localhost:8009/placesapi-packaged-war-1.0.0-SNAPSHOT/
ProxyPassReverse / ajp://localhost:8009/placesapi-packaged-war-1.0.0-SNAPSHOT/
</VirtualHost>
Используя вышеизложенное, когда мы делаем запрос GET на http://nathans-macbook-pro.local/places
, результирующий ответ выглядит следующим образом:
{
"links": [ {
"rel": "self",
"href": "http://nathans-macbook-pro.local/placesapi-packaged-war-1.0.0-SNAPSHOT/places",
"lastModified": "292269055-12-02T16:47:04Z"
} ]
}
Неправильно, потому что ссылка в ответе содержит контекст веб-приложения, и если клиент будет следовать этой ссылке, он получит 404
Кто-нибудь знает, как контролировать поведение Spring HATEOAS
в этом отношении? В основном мне нужно иметь возможность управлять именем веб-контекста, которое оно генерирует в ссылках.
Я немного пошутил и вижу, что с пользовательским заголовком X-Forwarded-Host
вы можете управлять хостом и портом, но я не мог видеть ничего подобного, чтобы иметь возможность контролировать контекст.
Другие варианты, которые мы рассмотрели, включают либо развертывание приложения в контексте ROOT, либо фиксированный именованный контекст, а затем соответствующим образом настроить наш виртуальный хост. Однако они скорее похожи на компромиссы, чем решения, потому что в идеале мы хотели бы разместить несколько версий приложения в одном контейнере (например: placesapi-packaged-war-1.0.0-RELEASE, placesapi-packaged-war-1.0.1- RELEASE, placesapi-packaged-war-2.0.0-RELEASE и т.д.) И перенаправить виртуальный хост на правильное приложение на основе заголовка http-запроса.
Любые мысли об этом будут очень оценены,
Приветствия
Натан