如果我误解了您的问题,或者您已经知道其中的大部分内容,请原谅我,但听起来您是在询问应用程序显示的数据与应用程序本身之间的区别。或者更一般地说,单页应用程序和服务器端呈现的页面之间的区别。
在服务器端呈现应用程序中,每个导航都会从服务器(或缓存)加载一个新 URL。服务器使用请求中的授权信息来获取适当的数据,将其插入到模板化的 HTML 页面中,然后返回该页面。根据客户的说法,页面显示的数据和页面本身是一个单一的实体。如果无法获取数据,则返回一个不同的页面,指示用户无权访问。
在单页应用程序中,您可以导航到的每个可能的“页面”都会下载一次,并且它们都没有任何实际数据。相反,这些页面是数据的容器。这些页面的行为向服务器发出 API 请求以显示数据。
应用程序本身不受保护——任何人都可以导航到它或其任何页面。但是,数据受到保护。如果用户无权访问 API 调用请求的数据,则会返回 401 状态代码和 JSON 错误正文。
因此,必须区分客户端和服务器端路由。您已经注意到客户端路由实际上并不发出 HTTP 请求——这是故意的。
如果您为应用程序和来自同一个应用程序的 API 提供服务,最好为所有 API 路由添加前缀,例如/api
. 例如,客户端路由是/heroes
,服务器端路由是/api/heroes
。这也允许移动应用程序(或任何其他非浏览器应用程序)使用您的 API;他们不会想要 HTML,因为他们有自己的呈现行为。
正如 Günter 所说,如果有一个页面在无法访问 API 数据的情况下无用,请将它们返回到登录页面。有两种情况下您无权访问 API 数据:您根本没有访问令牌,并且您的访问令牌已过期。
当您导航到/heroes
客户端路由时发出 API 请求。如果您没有访问令牌,请将它们放到登录页面。如果请求产生 401,则将它们返回到登录页面。如果返回200,则正常操作。
客户端路由阻碍的一个地方是尝试在浏览器中键入客户端路由 URL(而不是以编程方式导航到它)。有不同的策略可以避免这一点,这里有一个:https ://github.com/stablekernel/aqueduct/issues/274 。