返回对象中项目总数的最佳 RESTful 方法是什么?

2024-04-20

我正在为我参与的一个大型社交网站开发 REST API 服务。到目前为止,它运行良好。我可以发出GET, POST, PUT and DELETE请求对象 URL 并影响我的数据。但是,此数据是分页的(一次限制为 30 个结果)。

通过我的 API 获取会员总数的最佳 RESTful 方式是什么?

目前,我向如下 URL 结构发出请求:

  • /api/成员- 返回成员列表(如上所述一次 30 个)
  • /api/成员/1- 影响单个成员,具体取决于所使用的请求方法

我的问题是:如何使用类似的 URL 结构来获取应用程序中的成员总数?显然只要求id字段(类似于 Facebook 的 Graph API)并且计算结果将是无效的,因为只返回 30 个结果的一部分。


I have been doing some extensive research into this and other REST paging related questions lately and thought it constructive to add some of my findings here. I'm expanding the question a bit to include thoughts on paging as well as the count as they are intimitely related.

Headers

寻呼元数据以响应标头的形式包含在响应中。这种方法的一大好处是响应负载本身就是请求者所要求的实际数据。使对寻呼信息不感兴趣的客户端更容易处理响应。

有一堆(标准和自定义)标头用于返回分页相关信息,包括总计数。

X 总计数

X-Total-Count: 234

这用于some http://support.mashery.com/docs/read/mashery_api/30/Pagination APIs http://liquid-docs.readthedocs.io/en/latest/restapi.html#header-response我在野外发现的。还有NPM 包 https://www.npmjs.com/package/loopback-xtotalcount用于添加对此标头的支持,例如环回。一些articles https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/建议也设置此标头。

它经常与Linkheader,这是一个非常好的分页解决方案,但缺少总计数信息。

Link

Link: </TheBook/chapter2>;
      rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
      </TheBook/chapter4>;
      rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel

通过阅读有关该主题的大量内容,我觉得普遍的共识是使用Link header https://www.rfc-editor.org/rfc/rfc5988为客户提供分页链接rel=next, rel=previous问题在于它缺少总记录数的信息,这就是为什么许多 API 将其与X-Total-Count header.

或者,一些 API 和例如这JsonApi http://jsonapi.org/format/#document-links标准,使用Link格式,但将信息添加到响应信封中而不是标头中。这简化了对元数据的访问(并创建了添加总计数信息的位置),但代价是增加了访问实际数据本身的复杂性(通过添加信封)。

内容范围

Content-Range: items 0-49/234

由一篇名为的博客文章推广范围标题,我选择你(用于分页)! http://otac0n.com/blog/2012/11/21/range-header-i-choose-you.html。作者提出了强有力的理由来使用Range and Content-Range用于分页的标题。当我们仔细阅读the https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16 RFC https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35在这些标头中,我们发现将其含义扩展到字节范围之外实际上是 RFC 预期的并且是明确允许的。当在上下文中使用时items代替bytes, Range 标头实际上为我们提供了一种方法,既可以请求特定范围的项目,又可以指示响应项目与总结果的范围相关。此标题还提供了显示总数的好方法。这是一个真正的标准,主要一对一地映射到分页。也是在野外使用 https://github.com/glpi-project/glpi.

Envelope

许多 API,包括来自我们最喜欢的问答网站的一个 https://api.stackexchange.com/docs/wrapper use an envelope,数据的包装器,用于添加有关数据的元信息。还,OData http://www.odata.org and JsonApi http://jsonapi.org/format/#fetching-pagination标准都使用响应信封。

这样做的一大缺点(恕我直言)是处理响应数据变得更加复杂,因为必须在信封中的某个地方找到实际数据。此外,该信封有多种不同的格式,您必须使用正确的一种。很明显,OData 和 JsonApi 的响应信封截然不同,OData 在响应中的多个点混合了元数据。

单独的端点

我认为其他答案已经充分讨论了这一点。我没有调查这么多,因为我同意这样的评论,即这很令人困惑,因为你现在有多种类型的端点。我认为如果每个端点都代表一个资源(集合),那就最好了。

进一步的想法

我们不仅必须传达与响应相关的分页元信息,而且还允许客户端请求特定的页面/范围。有趣的是,也考虑这个方面,最终得到一个连贯的解决方案。在这里我们也可以使用标头(Rangeheader 看起来很合适),或者其他机制,例如查询参数。有些人主张将结果页面视为单独的资源,这在某些用例中可能有意义(例如/books/231/pages/52。我最终选择了一系列常用的请求参数,例如pagesize, page[size] and limit等除了支持Range标头(也作为请求参数)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

返回对象中项目总数的最佳 RESTful 方法是什么? 的相关文章

随机推荐

  • git - 有日志提交但缺少 .sln 文件,因此无法打开项目 - 如何恢复

    有什么方法可以使用 git 恢复我的项目文件吗 这是场景 我在一个分支机构工作了几天 该分支从未被推送到远程仓库 所以它完全是本地的 我最终丢失了 sln 解决方案文件 因此我无法再打开该项目 但在项目目录中我仍然有 git 目录 如果我发
  • ARView 黑屏

    我正在尝试以编程方式实例化 ARView 这是我的视图控制器代码 import Foundation import UIKit import RealityKit class ARViewController UIViewControlle
  • XPath 轴是否尊重 Xslt 排序?

    如果我像这样调用 xslt 模板
  • 如何在 Windows 上更改 npm 的缓存路径(或完全禁用缓存)?

    我已经在我的 Windows 7 x64 开发机器上安装了 Node js 手动方式 mkdir C Devel nodejs cd C Devel nodejs set NODE PATH CD setx M PATH PATH NODE
  • 用泛型 T 扩展类

    在 TypeScript 中 有没有办法用泛型类型扩展类 请参阅我的 假设场景 示例 其中我希望我的类具有名为 品种 或其他 的属性 interface dog breed string export class animal
  • 当我在 NetLogo 中取消世界环绕时,为什么会出现错误?

    我下载了一个工作模型 并正在对其进行调整以适应我的标准 我想禁用世界环绕 以便海龟在移动到初始屏幕时受到限制 但是当我这样做时 我收到一条错误消息 告诉我 OF预期输入是海龟代理集或补丁代理集或海龟或补丁 但没有得到任何人 欢迎来到 Sta
  • 如何使用多语言/多个index.html文件正确设置React Router?

    我正在构建一个 Web 应用程序 使用最新的 React 和 React Router 版本 就我而言 我的应用程序支持多种语言 并且由于索引 我们为每种语言都有单独的条目 html 文件 因此 对于像 myapp com 这样的 url
  • 使用 Shell 脚本根据条件编辑和更新 XML

    我想改变一个值 即value false 使用 Shell 脚本 我该如何去做呢 请向我提供任何建议 我尝试过 使用过的 我使用命令 gt sed s true false g ml xml Problem But all true内容改变
  • 为什么分配给多个目标(标识符/属性)会产生奇怪的结果?

    我有一些这样的代码 def foo bar initial bar Bar while True next bar Bar bar next bar next bar bar next bar return initial bar 其目的是
  • 具有 Room 和状态处理功能的 Kotlin 协程流

    我正在尝试新的协程流程 我的目标是创建一个简单的存储库 可以从 Web api 获取数据并将其保存到数据库 还可以从数据库返回流程 我使用 room 和 firebase 作为 Web api 现在一切看起来都非常简单 直到我尝试将来自 a
  • OCaml:用消息断言

    又是另一个问题 P 我不太确定是否应该将其发布在这里或 OCaml 邮件列表上 但我首先尝试这样做 我喜欢断言语句 然而 我发现如果没有附加消息 错误消息几乎毫无用处 第 XXX 行的断言冲突 很好 但实际上出了什么问题 我认为断言的一个很
  • 在 Javascript 中迭代数组

    我是一个 JavaScript 新手 我正在尝试练习一些示例 JavaScript 问题 当涉及到迭代数组的问题时 我有点困惑 有人能指出我正确的方向吗 我正在尝试接受价值观oldArray 分别添加 5 并存储在newArray var
  • Windows Phone 7 上的 Dispatcher.Invoke()?

    在回调方法中 我尝试获取文本框的文本属性 如下所示 string postData tbSendBox Text 但因为它不是在 UI 线程上执行 所以它给了我一个跨线程异常 我想要这样的东西 Dispatcher BeginInvoke
  • 从 powershell 脚本引用 .Net .dll

    您能帮我从 powershell 脚本引用 Net dll 吗 我正在使用 powershell ISE 编写 调试脚本 我有一些引用 Nuget 包的 net 代码 我想将该代码嵌入到 powershell 脚本中 如果我在 C WIND
  • 创建片段时的NPE

    我正在创建一个关于Fragment with sensorEventlitener 主要活动主办fragment如下代码所示 但在运行时我收到下面发布的内容logcat Errors 主要活动 public class MainActivi
  • 用于查找应用于特定分支的标签的命令

    用于查找应用于特定分支的标签的命令 假设我有一个名为 BR test 的分支名称 我想知道该分支上应用的所有标签是什么 如果这是 UCM 一个简单的lsbl就足够了 cleartool lsbl stream myStream mypvob
  • Django 的内存错误

    我有一个 Django 应用程序 它将大量数据加载到 sqlite3 数据库文件中 我们正在谈论数百万个条目 这些条目输入到一个函数中 在执行的某个时刻会抛出异常 File root codebase lib python2 6 site
  • 从单例类中检索 Ruby 对象?

    可以访问单例类 https ruby doc org core 2 5 1 Object html来自 Ruby 对象 some object singleton class 是否可以进行相反的操作 在单例类中访问原始对象 class lt
  • 找不到 com.google.android.gms:play-services:7.3.0

    我有来自 Android Studio gradle 的日志 Error A problem occurred configuring project ParseStarterProject gt Could not resolve all
  • 返回对象中项目总数的最佳 RESTful 方法是什么?

    我正在为我参与的一个大型社交网站开发 REST API 服务 到目前为止 它运行良好 我可以发出GET POST PUT and DELETE请求对象 URL 并影响我的数据 但是 此数据是分页的 一次限制为 30 个结果 通过我的 API