【问题标题】:Rest API enveloping or notRest API 封装与否
【发布时间】:2018-06-26 17:05:22
【问题描述】:

我有一个问题,我很难清楚地确定正确答案。

我的 API 有一个执行分页的端点。因此,在响应中,我必须向客户端返回受查询影响的总行数。实际记录数。

我已经读过,我应该像我想要的那样在正文中传递元数据,包裹它,但我也读过,用元数据影响正文是不行的,未来是回归主体上只有非元数据,这意味着它必须在响应头上。

奥莱利 If the information you are conveying through a custom HTTP header is important for the correct interpretation of the request or response, include that information in the body of the request or response or the URI used for the request. Avoid custom headers for such usages.

那么,我的问题是,解决问题的正确方法是什么?我应该在响应标头中传递行数还是将其放入消息正文中。

非常感谢。

【问题讨论】:

  • 我认为数据和元数据之间没有太大区别。事实上,总计数 数据,它对客户端很有用。我喜欢你的 O'Reilly 定义。如果你遵循这个,绝对不要把信息放在标题中。

标签: rest api


【解决方案1】:

对于分页,您可以在响应负载中使用信封:

{
  "data": [...],
  "paging": {
    "first": "http://api.example.com/foo?page=1&size=10",
    "previous": "http://api.example.com/foo?page=2&size=10"
    "next": "http://api.example.com/foo?page=4&size=10"
    "last": "http://api.example.com/foo?page=5&size=10"
  }
}

RFC 5005 中描述了similar approach:每页结果都是一个单独的资源,其中包含指向上一页和下一页结果的超链接


您也可以使用Link 标头(换行符只是为了便于阅读):

Link: <http://api.example.com/foo?page=1&size=10>; rel="first", 
      <http://api.example.com/foo?page=2&size=10>; rel="previous",
      <http://api.example.com/foo?page=4&size=10>; rel="next", 
      <http://api.example.com/foo?page=5&size=10>; rel="last"

检查link relations registered in IANA


对于返回记录数,我见过一些使用自定义标头的 API,例如 X-Total-Count,但我不推荐这种方法。然后在响应负载中发送这些详细信息。

【讨论】:

  • 好吧。那不是用例。我想发送数据库中的总记录。我已经知道如何解决分页了。我的问题是,我将把数据库中的项目数量发送到哪里。在正文或标题中。
  • @DiogoAleixo 我见过一些使用自定义标头的 API,例如 X-Total-Count,但我不推荐这种方法。然后在响应负载中发送这些详细信息。
  • 感谢@Cassio。我已经看过 X-Total-Count。你为什么不推荐这种方法?你有任何支持这句话的读物吗?
  • @DiogoAleixo HTTP 是一种可扩展协议。允许使用非标准标头,并可用于信息目的。但我认为在响应负载中包含此类详细信息没有任何害处。
猜你喜欢
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2020-01-21
  • 2012-10-23
  • 2020-01-16
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多