我正试图绕过HATEOAS。
让我们通过一个例子。客户端将浏览器加载到getemails.com。为简单起见,我们假设调用getemails.com,点击服务器并返回电子邮件列表。每封电子邮件都有一个链接,允许用户获取更多详细信息。像这样:
{[
{
"id": "1",
"subject" : "subject something",
_links:[
"email":"http://getemails.com/emaildetail/1"
]
}
{
"id": "2",
"subject" : "subject something else",
_links:[
"email":"http://getemails.com/emaildetail/2"
]
}
]}
这会在桌面上显示给用户。然后,用户单击一行,客户端代码将从所选行的_links下获取电子邮件URL,并调用服务器。然后它将使用电子邮件详细信息更新页面(假设SPA)。它还会将地址更新为getemails.com/#email/1
现在如果用户为getemails.com/#email/1位置添加书签怎么办?由于客户端应用程序尚未加载电子邮件列表,因此如何知道调用服务器获取更多信息的URL是emaildetail / 1?
答案 0 :(得分:3)
你的问题是你不是真正的RESTful。暴露像id字段这样的内部工作是你应该避免的陷阱。该ID仅在您的服务中有意义,它不应该像您一样在其之外传播。
而是使用每个资源的自我链接,因此当您请求“电子邮件”关系时,您应该返回一个电子邮件资源(可能是)
src
在SPA的片段标识符中使用该自我URL。现在,当用户为完整网址{
"subject" : "subject something",
"text" : "yadda yadda yadda...",
"from" : "here@there.com",
_links:{
"self":"http://getemails.com/emaildetail/1"
}
}
(带有一些网址编码)书签时,您的应用会知道要检索和呈现的资源。