使用 RESTful 应用请求所有记录的模式是什么?

What's the pattern to request for all records using RESTful app?

我想知道在请求所有记录时我的 RESTful 应用程序的最佳方法是什么。

例如,如果没有提供 $top 值以避免过载,我会将我的回复限制为 10。但是,如何格式化我的请求? $top=allrows$top=all 哪个更好?有没有我应该检查的模式?

如果未提供 $top 值,我只 return 最多 10 行。

GET /products?$top=

我只想避免这种情况:

GET /products/all

我会这样做:

对于所有产品 GET /products

对于某些产品 GET /products/{id}

对于所有过滤或排序的产品, 使用 GET /products 但让客户端在请求正文中向您发送 Filter 对象。 在那里它可以指定他是否想要分页中的某个页面,或者过滤一些记录等。

过滤对象可能如下所示: {"pageNumber":1,"pageSize":12,"freeText":"","conditions":[],"sortings":{}} 在您的服务中将其映射到内部服务过滤器和 return 请求的记录。

没有官方模式,任何选择都取决于您的数据大小。

无论您做什么,始终对您要 return 的项目数量设置 最大限制,无论客户端在请求中提供的参数如何。

此外,当参数未提供任何信息时,创建一个 默认计数 到 return。

如果您没有大量物品return,您可以将默认数量设置为最大限制 并且这足以始终 return 全部,您可以只制作 url 而没有任何关于特定计数的详细信息 return 全部。

GET /products   (no count/provided)

如果您有成百上千的人,并且您的 默认计数 为 100,也许可以使用一些明确的 count 来扩展该限制(最多当然——如果要求计数 > 最大值,return 一个 400 错误请求,消息指示计数不能高于最大值)

 GET /products?count=1000000

但是,如果您不断将最大限制推得越来越高,这对您的服务器 and/or 客户端来说可能会很糟糕。

通常,如果您有很多记录,您会将其分块并使用计数和偏移量将其分成字节大小的块。还将元数据添加到响应对象,让请求者知道当前位置、总记录和提供的偏移量

一点伪代码:

$count = 1000
$offset = 0
While count*offset < total records:
    GET /products?count=$count&offset=$offset
    $offset = $offset + $count

假设其中一个请求如下所示:

 GET /products?count=1000&offset=1000 

然后在响应正文中你会期望这样的东西:

{
   "result": [
         {
           "id": "123",
           "name": "some product",
           "link": "/product/123"
         },

         ... many more products ...

         {
           "id": "465",
           "name": "another product",
           "link": "/product/465"
          }

    ],
    "meta": {
         "count": 1000,
         "offset": 1000,
         "total_count": 3000,
         "next_link": "/products?count=1000&offset=2000",
         "prev_link": "/products?count=1000&offset=0",

     },

     "status": 200
}

如果你真的想要金星,你可以让你的资源遵守 HATEOS ( https://en.wikipedia.org/wiki/HATEOAS ) 并在列表中包含指向单个资源的链接,也许在元中有指向下一个和前一个块的链接如果您正在浏览大量项目,请使用该列表。我在上面的 json 示例中放置了一些示例链接。