RESTful API是否应该避免要求客户端知道资源层次结构?

时间:2017-01-04 23:25:01

标签: rest hypermedia

我们的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;

这样可以,还是有更好的方法让客户安全地导航这样的层次结构?

1 个答案:

答案 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。

相关问题