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

时间:2016-11-22 15:09:31

标签: rest restful-url

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

例如,如果没有提供$ top值以避免过载,我会将响应限制为10。但是,我如何格式化我的请求?好的$ top = allrows或$ top = all?。我检查有什么模式吗?。

如果没有提供$ top值,我最多只返回10行。

GET /products?$top=

我只是想避免这种情况:

GET /products/all

提前致谢,

Alirio。

2 个答案:

答案 0 :(得分:3)

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

无论您做什么,无论客户在请求中提供的参数如何,始终将最大限制设置为您将返回的项目数。

此外,创建默认计数,以便在参数未提供任何信息时返回。

如果您没有大量要退货的商品,那么您可以将默认点数设置为最大限额,这足以让您全部返回你可以在没有特定计数的任何细节的情况下制作网址。

GET /products   (no count/provided)

如果您有数百或数千,并且您的默认计数比100,可以使用明确的count来扩展该限制(当然最多 - 如果要求计数> max,返回400错误请求,并显示指示计数不能超过最大值的消息

 GET /products?count=1000000

但是,如果你不断推高最高限制,这对你的服务器和/或客户来说可能会很糟糕。

通常情况下,如果你有很多记录,你可以将它组合起来并使用计数和偏移量将其下拉为字节大小的块。还要将元数据添加到响应对象,让请求者知道当前位置,总记录和提供的偏移量

一个小伪代码:

$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)并包含指向列表中各个资源的链接,并且可能在meta中包含指向列表的下一个和前一个块的链接如果你走了一大堆物品。我在上面的json示例中放了一些示例链接。

答案 1 :(得分:0)

我会这样做:

适用于所有产品GET /产品

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

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

过滤器对象可能如下所示: { “PAGENUMBER”:1, “pageSize的”:12, “FREETEXT”: “”, “条件”:[], “分类法,”:{}} 在您的服务中将其映射到内部服务过滤器并返回请求的记录。