0

例如,当您使用 ASP.NET MVC 创建单页应用程序和使用 REST 的一些 Web API 控制器时,往往会向服务器发出大量请求,因为视图通常依赖于一些复杂的数据。在一个普通的网络项目中,我肯定会尝试创建尽可能少的请求,也许这适用于单页应用程序?就我而言,我的应用程序依赖于两种类型的对象和一些相同类型的集合。在客户端,我正在使用 Backbone.js,我的控制器正在处理每个 for 的一种类型Get()Get(int id)比如应该实现 REST。就我而言,这不是一个开放的 API,只是我的应用程序在使用它。这是我的应用程序所依赖的 JSON 示例。

{
    CurrentPage: {
        Heading: "Home",
        Id: "pages/193",
        Metadata: {
            Name: "Home",
            Title: null,
            Keywords: null,
            Description: null,
            DisplayInMenu: true,
            Published: "/Date(1334499539404)/",
            Changed: "/Date(1334499539404)/",
            ChangedBy: "Marcus",
            IsPublished: true,
            IsDeleted: false,
            Slug: null,
            Url: null,
            SortOrder: 0
        },
        Parent: {
            id: "pages/293",
            slug: "slug",
            url: "url"
        },
        Children: [
            "pages/226",
            "pages/257"
        ]
},
    ParentPage: {
        Heading: "Parent",
        Id: "pages/293",
        Metadata: {
            Name: "Parent",
            Title: null,
            Keywords: null,
            Description: null,
            DisplayInMenu: true,
            Published: "/Date(1334499539404)/",
            Changed: "/Date(1334499539404)/",
            ChangedBy: "Marcus",
            IsPublished: true,
            IsDeleted: false,
            Slug: "slug",
            Url: "url",
            SortOrder: 0
        },
        Parent: null,
        Children: []
},
    Children: [
        {
            Heading: "Foo",
            MainBody: null,
            Id: "pages/226",
            Metadata: {
                Name: "I'm an article",
                Title: null,
                Keywords: null,
                Description: null,
                DisplayInMenu: true,
                Published: "/Date(1334511318838)/",
                Changed: "/Date(1334511318838)/",
                ChangedBy: "Marcus",
                IsPublished: true,
                IsDeleted: false,
                Slug: "i-m-an-article",
                Url: "i-m-an-article",
                SortOrder: 1
            },
            Parent: {},
            Children: [ ]
        },
        {
            Heading: "Bar",
            MainBody: null,
            Id: "pages/257",
            Metadata: {
                Name: "Foo",
                Title: null,
                Keywords: null,
                Description: null,
                DisplayInMenu: true,
                Published: "/Date(1334953500167)/",
                Changed: "/Date(1334953500167)/",
                ChangedBy: "Marcus",
                IsPublished: true,
                IsDeleted: false,
                Slug: "foo",
                Url: "foo",
                SortOrder: 2
            },
            Parent: {},
            Children: [ ]
        }
    ]
}

在查看上述响应时,我确信答案是将这些数据合并到我的控制器中,而不是由它们自己获取对象和集合,但我仍然对第二种意见感到好奇。

4

1 回答 1

0

将您的收藏品彼此分开并没有什么特别的错误。
但是,如果您正在构建单页应用程序(或至少是具有高度动态内容的页面),请确保优化您的请求。

我看到很多地方可能会出错,但我也已经看到了正确的地方。

您已经将您的文章作为一个集合来处理。
你没有你的身体在那里,但同样,这可能是好是坏,取决于你想要实现的目标。

我可以告诉你,在同一个 JSON 响应中下载两打 500-1500 字的文章,加上每篇的评论,加上上述所有内容的元数据/微数据,将和只下载 shell 一样痛苦(对于“最新故事”小部件和文档树视图),然后在自己的调用中获取每个内容的内容......

但是考虑一下:这些都不违反 REST 的原则。
REST 只是规定您应该传输状态,每个 URL 都应该指向一个有意义的名词,并且您使用的 HTTP 动词应该指示对该名词做了什么,以及如何将所做的结果传达给客户端。

REST 本质上不是超媒体。它不一定与每个数据子集都有 URL 关联的兔子洞,其中一个集合中的一个项目可能有一个指向另一个集合的项目的 url,它可能有一个指向另一个集合的 url,并且您需要访问每个其中获取您想要的所有数据,以显示一篇富媒体博客文章...

如果你有一个超媒体系统为你工作,恭喜。
严重地。如果你能自己写出来,对你有好处。
但是 REST 只希望 URL 是唯一的,或者,如果是集合,则希望集合以可预测的方式返回,根据 URL。

那么是什么阻止你想出一个恰好是其他东西的集合的集合呢?REST 不在乎前端的解析,或者后端的集合。
或者,如果您坚持当前格式,请考虑即时数据服务。

我的意思是:
如果我将所有最后 10 篇文章作为一个集合加载并显示它们,我将推迟获取任何评论,直到用户单击“显示更多”按钮或向下滚动足以看到评论等,然后我会收集该特定文章的评论。

前端的目标不是试图将所有请求限制为 1 个巨大的请求。
前端的目标是快速加载,即使它只是为了达到你有几个小部件说“正在加载......”并让开,以便用户可以与什么进行交互是否存在,尽快,并将内容流式传输,对用户不可见(无论是在计时器上流式传输,还是基于与按钮或事件或其他任何交互的交互)。

这对于 REST 来说是非常可行的,甚至对于超媒体范式也是可行的。
你只需要小心你预先要求多少。

于 2013-03-31T09:05:35.743 回答