首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >来自RESTful应用编程接口的分页响应有效负载

来自RESTful应用编程接口的分页响应有效负载
EN

Stack Overflow用户
提问于 2012-08-28 22:47:57
回答 5查看 126.2K关注 0票数 92

我想在我的RESTful应用程序接口中支持分页。

我的API方法应该通过/products/index返回产品的JSON列表。然而,可能有数千种产品,我想浏览一下它们,所以我的请求应该类似于:

代码语言:javascript
运行
AI代码解释
复制
/products/index?page_number=5&page_size=20

但是我的JSON响应应该是什么样子呢?API使用者通常会期望响应中包含分页元数据吗?或者只需要一系列产品?为什么?

看起来Twitter的API包含了元数据:https://dev.twitter.com/docs/api/1/get/lists/members (参见示例请求)。

对于元数据:

代码语言:javascript
运行
AI代码解释
复制
{
  "page_number": 5,
  "page_size": 20,
  "total_record_count": 521,
  "records": [
    {
      "id": 1,
      "name": "Widget #1"
    },
    {
      "id": 2,
      "name": "Widget #2"
    },
    {
      "id": 3,
      "name": "Widget #3"
    }
  ]
}

只有一组产品(没有元数据):

代码语言:javascript
运行
AI代码解释
复制
[
  {
    "id": 1,
    "name": "Widget #1"
  },
  {
    "id": 2,
    "name": "Widget #2"
  },
  {
    "id": 3,
    "name": "Widget #3"
  }
]
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-29 05:01:47

ReSTful API主要由其他系统使用,这就是我将分页数据放在响应头中的原因。但是,一些API使用者可能无法直接访问响应头,或者可能在您的API上构建UX,因此提供一种在JSON响应中检索(按需)元数据的方法是有好处的。

我认为您的实现应该默认包含机器可读的元数据,并在请求时包含人类可读的元数据。如果您愿意,人类可读的元数据可以随每个请求一起返回,或者最好是通过查询参数(例如include=metadatainclude_metadata=true )按需返回。

在您的特定场景中,我将在记录中包含每个产品的URI。这使得API使用者可以很容易地创建指向各个产品的链接。我也会根据我的寻呼请求的限制设置一些合理的期望。实现和记录页面大小的默认设置是一种可接受的做法。例如,GitHub's API将默认页面大小设置为30条记录,最大为100条,另外还设置了查询次数的速率限制。如果您的API有默认的页面大小,那么查询字符串可以只指定页面索引。

在人类可读的场景中,当导航到/products?page=5&per_page=20&include=metadata时,响应可能是:

代码语言:javascript
运行
AI代码解释
复制
{
  "_metadata": 
  {
      "page": 5,
      "per_page": 20,
      "page_count": 20,
      "total_count": 521,
      "Links": [
        {"self": "/products?page=5&per_page=20"},
        {"first": "/products?page=0&per_page=20"},
        {"previous": "/products?page=4&per_page=20"},
        {"next": "/products?page=6&per_page=20"},
        {"last": "/products?page=26&per_page=20"},
      ]
  },
  "records": [
    {
      "id": 1,
      "name": "Widget #1",
      "uri": "/products/1"
    },
    {
      "id": 2,
      "name": "Widget #2",
      "uri": "/products/2"
    },
    {
      "id": 3,
      "name": "Widget #3",
      "uri": "/products/3"
    }
  ]
}

对于机器可读的元数据,我会在响应中添加Link headers

代码语言:javascript
运行
AI代码解释
复制
Link: </products?page=5&perPage=20>;rel=self,</products?page=0&perPage=20>;rel=first,</products?page=4&perPage=20>;rel=previous,</products?page=6&perPage=20>;rel=next,</products?page=26&perPage=20>;rel=last

(链接标头值应为urlencoded)

...and可能是自定义的total-count响应头,如果您这样选择的话:

代码语言:javascript
运行
AI代码解释
复制
total-count: 521

以人为中心的元数据中显示的其他分页数据对于以机器为中心的元数据可能是多余的,因为链接标头让我知道我在哪个页面上以及每页的数量,并且我可以快速检索数组中的记录数量。因此,我可能只会为总计数创建一个标题。您可以随时改变主意,并添加更多元数据。

顺便说一句,您可能注意到我从您的URI中删除了/index。一个普遍接受的约定是让您的ReST端点公开集合。将/index放在末尾会使这一点变得有点混乱。

这些只是我在使用/创建API时想要的几件事。希望这能有所帮助!

票数 122
EN

Stack Overflow用户

发布于 2012-08-29 00:13:40

作为编写了几个使用REST服务的库的人,让我从客户的角度来解释为什么我认为将结果包装在元数据中是可行的:

  • 没有总计数,客户端如何知道它还没有收到所有的结果集并且应该继续对结果集进行分页?在没有执行向前看下一页的UI中,在最坏的情况下,这可能表示为一个Next/More链接,该链接实际上没有在响应中获取更多的data.
  • Including元数据,从而允许客户端跟踪更少的状态。现在,我不必将REST请求与响应相匹配,因为响应包含重新构造请求状态所需的元数据(在本例中,游标指向数据集)。
  • 如果状态是响应的一部分,则可以同时对同一数据集执行多个请求,并且可以按请求到达的任何顺序处理请求,而不一定是我发出请求的顺序。

还有一个建议:和Twitter API一样,应该用直接的索引/游标替换page_number。原因是,API允许客户端设置每个请求的页面大小。返回的page_number是客户端到目前为止请求的页面数量,还是给定上次使用的page_size的页面数量(几乎可以肯定是后者,但为什么不完全避免这种多义性呢)?

票数 30
EN

Stack Overflow用户

发布于 2016-08-02 13:41:20

我建议添加相同的头文件。将元数据移动到头部有助于摆脱resultdatarecords等信封,而响应正文只包含我们需要的数据。如果您也生成分页链接,则可以使用Link header。

代码语言:javascript
运行
AI代码解释
复制
    HTTP/1.1 200
    Pagination-Count: 100
    Pagination-Page: 5
    Pagination-Limit: 20
    Content-Type: application/json

    [
      {
        "id": 10,
        "name": "shirt",
        "color": "red",
        "price": "$23"
      },
      {
        "id": 11,
        "name": "shirt",
        "color": "blue",
        "price": "$25"
      }
    ]

有关详细信息,请参阅:

https://github.com/adnan-kamili/rest-api-response-format

对于swagger文件:

https://github.com/adnan-kamili/swagger-response-template

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12168624

复制
相关文章
golang : gorm + gin实现restful 分页接口
使用页码表示法对前端开发比较友好,但是本质上是和偏移量表示发相似. 在这里我们将使用 jinzhu/gorm和 gin-gonic/gin 开发一个简单的分页接口
OwenZhang
2021/12/08
3K0
golang : gorm + gin实现restful 分页接口
接口测试之RESTful案例应用
在接口测试之RESTful中对RESTful做了详细的介绍,在前面的基础上继续完善案例的应用。在接口测试中,当客户端请求服务端,服务端响应返回给客户端,返回的这些这些信息除了响应头,还有就是业务状态码,msg以及数据,比如登录一个系统成功后,它返回的内容可能是:{"status":0,"msg":"ok","datas":{"userid":1001,"name":"wuya"}},这里还是看一个案例的应用,比如登录抽屉网失败,看服务端返回给客户端的信息,如下图所示:
无涯WuYa
2019/08/15
5600
openshift/origin工作记录(2)——RESTful编程接口使用
该文介绍了如何使用RESTful编程接口对OpenShift进行操作,包括获取工程列表、获取工程详情、创建命名空间等操作。同时,还介绍了如何获取用户账号的token,以便进行更高级的操作。
胡了了
2017/12/28
1.3K0
openshift/origin工作记录(2)——RESTful编程接口使用
RESTful 接口
REST 将资源的状态以适合客户端的形式从服务端发送到客户端(或相反方向)。在 REST 中,通过 URL 进行资源定位,用 HTTP 动作(GET、POST、DELETE、PUT等)描述进行操作,完成功能。
Jimmy_is_jimmy
2023/07/31
1K0
RESTful 接口
restful接口规范
0902自我总结 restful接口规范 1.一般都采用安全协议(接口都是操作数据的):https http协议 应用层协议 请求与响应规范:首行 - 头 - 体 特点:无状态、无连接、请求永远是客户端到服务器端、ssl 而 https协议 相对于http协议多了个ssl安全套接层 #https比http传输速度要蛮 #https比http数据更加安全 2.体现接口的关键字 https://api.xxx.com/books/ 3.接口操作的数据称之为资源:采用资源名称的复数 https:
小小咸鱼YwY
2019/09/11
1.2K0
RESTful接口测试
RESTful风格的接口与测试工程师有什么关系呢?要想真正理解RESTful风格的接口与测试工程师的关系,就必须先弄清楚RESTful风格的接口有什么优点。
FunTester
2023/08/04
2430
RESTful接口测试
Restful接口的版本控制
软件迭代是开发者必须面临的问题,现在有一个容易被大家忽略的问题就是 API 的版本控制。不是所有的用户都热衷于最新的版本的软件,而业务又是多变的。因此当新版本发布时要确保向后兼容,所以就需要 API 的版本控制。今天就来探讨一下常用的 Restful API 版本控制。
码农小胖哥
2020/10/30
6660
Restful接口的版本控制
RESTful风格的应用
@RestController:简化开发过程。不需要在方法上额外添加@ResponseBody
Breeze.
2022/09/23
2910
RESTful风格的应用
本节讲解一个全新的话题,RESTful开发风格。 REST :全称Representational State Transfer(表现层状态转换),资源在网络中,以某种表现形式进行状态转移。听起来很难理解,其实说白了就是在我们web环境下,如果你要获取某个图片,js,网页这些资源的时候,就要以url的形式进行表现。我们访问一个图片的网址,那这个资源返回的就自然是一张图片,如果访问的是一个CSS,那返回的就是一个CSS。好像这种设计理念对于我们的web应用来说是在再基础不过的东西。其实这是rest给我们提出来的一个设计理念,在web环境以URL的方式,来进行资源的传递。那么基于这种REST的理念,注意,是理念,不是具体的实现。
害恶细君
2022/11/22
6430
RESTful风格的应用
Go 编程 | 连载 19 - 接口的应用
定义 Mark1、Mark2 和 Mark44 三个接口,Mark44 除了拥有 Mark1 和 Mark2 的所有功能(方法)外,还有自己独特的功能。
RiemannHypothesis
2022/09/28
6020
RESTful接口入门 转
从下面的图片可以看出,当我们需要把相同的数据展示到不同的界面上时,提供一个可以访问后台的接口,前台只负责将数据友好的,华丽的展示出来即可。而不需要为每一个前台都实现很多的后台逻辑。 
wuweixiang
2018/08/14
8390
RESTful 接口设计指南
网络应用程序,分为前端和后端两个部分,当前的发展趋势,就是前端设备层出不穷,如手机、平板、桌面电脑等等。
越陌度阡
2020/11/26
6760
RESTful接口设计风格
其中PUT和PATCH比较相似,都是做更新操作。PUT一般用于全部修改进行替换操作,PATCH用于更新部分字段(资源)操作。
砒霜拌辣椒
2023/08/23
1680
接口测试之RESTful
REST又被称为表征性状态传输,它是指客户端与服务端之间传输信息的一种方式。在REST中并没有严格的标准和规范,它只是规定了一套对通信的约束,当然它也存在一些指导的约束,也就是说客户端与服务端关注的是分离,只要API改变。常见的RESTful系统形式由JSON组成,每个资源位于自己的URL路径上,并使用不同的HTTP请求方法进行操作。在这里还是以具体的案例来说明这部分的应用,在无涯课堂里面添加课程的信息,获取所有课程的信息,以及获取某一个课程的信息,和对课程信息进行修改,以及删除课程的信息。需要安装的第三方的库为:flask-restful,flask-httpauth,flask,安装成功后,就实现具体的案例代码。
无涯WuYa
2019/08/13
6560
接口测试之RESTful
JavaScript异步编程设计快速响应的网络应用
因为setTimeout回调在while循环结束运行之前不可能被触发! 调用setTimeout时,会有一个延时事件排入队列。然后继续执行下一行代码,直到再没有任何代码(处理器空闲时),才执行setTimeout回调函数(前提已到达其延迟时间)。 JavaScript代码永远不会被中断,这是因为代码在运行期间内只需要安排队事件即可,而这些事件在代码运行结束之前不会被触发! 请参考:JavaScript事件驱动机制&定时器机制
奋飛
2019/08/15
2.1K0
【RESTful】RESTful API 接口设计规范 | 示例
参考官方文档:https://tools.ietf.org/html/rfc2616
前端修罗场
2023/10/07
1.8K0
【RESTful】RESTful API 接口设计规范 | 示例
Restful接口开发与测试—接口测试
开发完接口,接下来我们需要对我们开发的接口进行测试。接口测试的方法比较多,使用接口工具或者Python来测试都可以,工具方面比如之前我们学习过的Postman或者Jmeter ,Python脚本测试可以使用Requests + unittest来测试。
清风穆云
2021/08/09
1.8K0
应用程序编程接口-API
API(Application Programming Interface):应用程序编程接口
星哥玩云
2022/09/14
4400
应用程序编程接口-API
Flask-RESTful的请求和响应处理(一)
在 Flask-RESTful 应用程序中,请求和响应处理非常简单。我们可以使用 Flask-RESTful 的 reqparse 模块来解析请求参数,并使用 Flask-RESTful 的 marshal 模块来序列化响应数据。
堕落飞鸟
2023/05/06
7740
Flask-RESTful的请求和响应处理(二)
除了使用 RequestParser 和 marshal_with() 装饰器来解析请求参数和序列化响应数据之外,Flask-RESTful 还提供了一些其他的请求和响应处理功能,例如请求钩子、异常处理和跨域资源共享(CORS)支持等。
堕落飞鸟
2023/05/06
6200

相似问题

部分有效负载的RESTful服务响应代码

13

RESTful应用编程接口设计

23

RESTful应用编程接口架构

22

RESTful应用编程接口建议

22

RESTful应用编程接口文档

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文