我想知道我在请求所有记录时的最佳方法是什么。
例如,如果没有提供$top
值以避免过载,则我将响应限制为10。但是,如何格式化我的请求?哪个更好,$top=allrows
或$top=all
?我应该检查任何模式吗?
如果没有提供$top
值,我只返回10行。
GET /products?$top=
我只想避免这种情况:
GET /products/all
没有官方模式,任何选择都取决于数据的大小。
无论您做什么,始终将最大限制放在您将返回的项目数量中,无论客户端在请求中提供的参数如何。
另外,创建默认计数在参数未提供信息时返回。
如果您没有大量的项目要返回,则计数默认计数为最大限制,足以始终返回全部只需在没有任何特定计数的详细信息的情况下将URL返回。
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),并在列表中包含指向单个资源的链接,也许在元中有链接到如果您要走大量物品,则列表中的下一个也是以前的块。我在上面的JSON示例中放了一些示例链接。
我会这样这样做:
所有产品获取/产品
对于某些产品get/products/{id}
对于所有具有过滤或排序的产品,使用获取/产品,但让客户在请求主体中向您发送过滤对象。它可以指定他是否想要分页上的某些页面,或过滤一些记录等。
过滤对象看起来像:{" pagenumber":1," pageize":12," freetext":","条件":[]," saterings":{}}}在您的服务中,它将其映射到内部服务过滤器并返回请求的记录。