通过 RESTful 最佳服务,有 HATEOAS 原则告诉我们,我们不应该允许客户端构建资源 URL-s。如果我们遵循这个原则,就很难共享客户端的当前状态。例如,如果您在服务器上有一个 REST 服务,并且您通过 AJAX 使用单页 javascript 客户端获取数据,那么您将有 2 个 url。一个用于客户端状态,一个用于您从 REST 服务获得的结果。由于 pushState,您只能与使用共享客户端状态...如果有人使用以前共享的 url 运行客户端,那么她的客户端将不知道它应该调用的 REST 服务的 url,因为客户端无法构建URL-s,只需从 REST 服务接收并使用它。
例如:
- 我浏览
http://my.client.com
- 页面从 中获取根资源
http://my.api.com
,并返回一个链接 - 链接包含
http://my.api.com/users
url,带有 rel 用户集合 - 之后,客户端显示一个带有标签的按钮:userlist
- 我单击该按钮,客户端从 api 获取数据,并打印用户列表
- 如果我想与我的女朋友共享用户列表,那么我必须使用 pushState 从客户端更改浏览器 url,例如从
http://my.client.com
更改为http://my.client.com/users
- 之后我把那个网址发给我的女朋友
- 她将其复制粘贴到浏览器地址栏中,然后按 Enter。在那之后,客户说了一个巨大的 wtf,因为 - 就像 John Snow - 它不知道那个 url 意味着什么状态......
这个问题可以解决,如果我们允许客户端GET http://my.api.com/users
从 url:构建http://my.client.com/users
,但这不会是 RESTful,因为客户端不应该构建 api urls...
如果我想在客户端显示一个嵌套菜单,那就是另一个问题,因为我不想在每个答案中都发送整个菜单树。我可以为每个资源创建一个菜单投影,或者使用 OPTIONS 方法或自定义方法来发送该数据,但这会很麻烦。这可以通过以下rel=up
链接来解决 - 从 REST 服务获得 - 串联,但如果我不知道应该从哪里关注,它将无法工作......
谷歌机器人也会出现这个问题......
我怎样才能既解决这个问题又保持在 HATEOAS 原则的范围内?