我们的API入口点有一个名为" x:reports" (其中 x 是HAL表示中定义的前缀,通过居里 - 但现在并不重要。)
有几种类型的报告。关注" x:报告"提供了一组这些可供性,每个都有自己的相关性 - 一个名为" x:proofofplay"。有一组与此类报告关联的查找值(仅此类报告)。以下" x:proofofplay"返回的表示形式依赖于这套价值观" x:艺术品"。
这导致以下层次结构
reports
proofofplay
artwork
而" x:艺术品"资源相当小,需要一些时间来获取它(10秒)。因此,客户选择在应用启动时异步加载它。
为了获得" x:艺术品"的href,客户必须遵循链接。我不确定这是不是一个问题。这似乎可能是不可靠的,因为客户端依赖于对此资源路径的带外知识。如果艺术品的路径发生变化(极不可能),客户端将会中断(尽管href本身可能会随着有罪不罚而改变)。
要了解我所关注的原因,启动功能如下所示:
launch: function () {
var me = this;
Rest.getLinksFromEntryPoint(function(links) {
Rest.getLinksFromHref(links["x:reports"].href, function(reportLinks){
Rest.getLinksFromHref(reportLinks["x:proofofplay"].href, function(popLinks){
me.loadArtworks(popLinks["x:artwork"].href);
});
});
});
}
这条路径的硬编码同时让我觉得这很好 - 它基于已发布的资源模型"和#34;我打赌罗伊菲尔丁会对我生气#34;
这样可以,还是有更好的方法让客户安全地导航这样的层次结构?
答案 0 :(得分:0)
HAL对此的回答是嵌入资源。
根据您的服务器端技术的不同,在您的情况下这应该足够好,因为您需要在应用程序启动之前存在所有数据,并且由于您担心按顺序执行此操作,因此您可以并行化在服务器上。
理想情况下,您的HAL客户端应该将_links
中的内容和_embedded
中的内容视为相同类型的内容,但在第二种情况下,您还要为HTTP缓存执行以下操作:资源。
我们基于js的客户端做了类似的事情:
var client = new Client(bookMarkUrl);
var resource = await client
.follow('x:reports')
.follow('x:proofofplay')
.follow('x:artwork')
.get();
如果_links
中指定了这些中间链接中的任何一个,我们将按照链接按需执行GET
个请求,但如果_embedded
中出现任何请求,则会跳过该请求并使用本地缓存。这样做的好处是,将来我们可以添加_links
到_embedded
的新内容,并加快那些不必了解此更改的客户。这一切都是无缝的。
将来我们打算从HAL的_embedded
切换到使用HTTP2 Push。