我们正在寻找一些关于在由 HATEOAS REST API 支持的 Web 应用程序中处理 URL(以及与每个 URL 相关的状态)的建议,更具体地说,
- 如何避免将 Web 应用程序 URL 与 REST API URL 耦合
- 如何在单个视图中处理多个资源
但让我首先提供更多背景信息:
我们正在一个带有超媒体约束的 REST 层之上构建一个 Angular Web 应用程序。(注意:我更喜欢简单地使用术语“超媒体(约束)”而不是 HATEOAS)。
正如超媒体约束所规定的,应用程序中任何时间点的可用操作和链接都由 REST API 提供。因此,Web 应用程序不应包含 REST API 的任何硬编码 url,除了“根”(假设该概念确实存在于 REST API 中)。
另一方面,Web 应用程序中的每个页面都需要可添加书签。所以我们不能创建一个黑盒应用程序(在不更改 URL 的情况下在 SPA 中处理单个 URL 和所有状态更改)。这意味着 Web 应用程序也有它的 URL 空间,它需要以某种方式映射到 REST API URL 空间。这已经与超媒体理念相冲突。
在 Angular 应用程序中,我们使用 UI Router 来处理应用程序状态。这是我们如何让它工作的:
- 我们只定义状态,没有 URLS
- 我们定义了一个 $urlRouterProvider.otherwise 处理程序,它将当前 Web 应用程序 URL 映射到相应的 REST API URL,检索与该 REST URL 对应的资源表示并将其传递给控制器(在 $stateParams 中)。
- 然后控制器可以使用表示中的数据(以及链接和操作),就像它自己(或通过服务)进行 REST 调用一样
到目前为止这么好(或不是真的),因为这种方法有一些缺点:
- Web 应用程序 URL 映射到 REST API URL,因此两个 URL 空间是耦合的,这与使用超媒体约束的基本假设之一相冲突:我们不能在不更改 Web 应用程序的情况下更改 REST API URL。
- 在 $urlRouterProvider.otherwise 处理程序中,我们检索当前 Web 应用程序 URL 的表示。但在某些情况下,我们在单个视图中有两个资源(使用 UI Router 嵌套状态):例如项目列表和单个项目的详细信息。但是只有一个 URL,所以只检索项目详细信息的表示,项目列表保持为空。
因此,我们很想听听一些关于如何改进处理这两个 URL 空间的方法的建议。有没有更好的方法让 REST API 决定 Web 应用程序的(可用)行为,并且在 Web 应用程序中仍然有可收藏的 URL?因为现在我们有某种感觉并不完全正确的混合方法。
提前致谢。
问候,
卢克