【问题标题】:What's the pattern to request for all records using RESTful app?使用 RESTful 应用程序请求所有记录的模式是什么?
【发布时间】:2016-11-22 15:09:30
【问题描述】:

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

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

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

GET /products?$top=

我只是想避免这种情况:

GET /products/all

提前致谢,

Alirio。

【问题讨论】:

    标签: rest restful-url


    【解决方案1】:

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

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

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

    如果您没有大量要退回的物品,您可以将 默认计数 设置为 最大限制,这足以始终退回所有物品,您可以只需将没有任何具体计数详细信息的 url 全部返回即可。

    GET /products   (no count/provided)
    

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

     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) 并在列表中包含指向各个资源的链接,如果你在元数据中可能有指向列表中下一个和前一个块的链接'正在走一大串项目。我在上面的 json 示例中放置了一些示例链接。

    【讨论】:

    • 哇雷。非常感谢您的详细回答。这真的有助于我更多地了解我应该遵循的方法。
    【解决方案2】:

    我会这样做:

    对于所有产品 GET /products

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

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

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

    【讨论】:

    • 最好检查@Ray 的答案。 “无论您做什么,无论客户端在请求中提供什么参数,始终对您将返回的项目数量设置一个最大限制。”
    • 这是不正确的 - 虽然没有什么可以阻止您这样做,但 GET 请求不应接受和/或要求请求正文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2018-08-15
    • 2020-12-23
    相关资源
    最近更新 更多