我们正在构建一个 API 并使用Spring RestController
s 和Spring HATEOAS
.
当 war 文件被部署到一个容器并且一个 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"
} ]
}
因为 Web 上下文是已部署应用程序的上下文(例如placesapi-packaged-war-1.0.0-SNAPSHOT
:)
在真实的运行时环境(UAT 及更高版本)中,容器很可能位于 http 服务器后面,例如Apache
虚拟主机或类似服务器位于 Web 应用程序前面的位置。像这样的东西:
<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"
} ]
}
这是错误的,因为响应中的链接包含 Web 应用程序上下文,并且如果客户端要遵循该链接,他们将得到 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 请求标头转发到正确的应用程序。
对此的任何想法将不胜感激,
干杯
弥敦道