RESTful API,如果查询字符串为';时间不够长?

RESTful API,如果查询字符串为';时间不够长?,rest,Rest,我们有一个产品资源集合:/products 我们希望筛选此集合以仅返回具有特定类id列表之一的成员。例如: GET/products?class=100101102 这将返回具有列出的任何类的产品成员的集合 我们面临的问题是,我们正在处理数千个产品和类,因此id的类列表可能有数千个,对于查询字符串来说太长了 无论何时只要有可能,我都会坚持RESTful原则,因此我喜欢这样一个事实,即使用GET调用资源/products?classes=100101102时返回一个过滤后的产品集合 显然,我们可以

我们有一个产品资源集合:
/products

我们希望筛选此集合以仅返回具有特定
id
列表之一的成员。例如:

GET/products?class=100101102

这将返回具有列出的任何类的产品成员的集合

我们面临的问题是,我们正在处理数千个产品和类,因此
id
的类列表可能有数千个,对于查询字符串来说太长了

无论何时只要有可能,我都会坚持RESTful原则,因此我喜欢这样一个事实,即使用
GET
调用资源
/products?classes=100101102
时返回一个过滤后的产品集合

显然,我们可以在主体中以JSON格式包含
id
的列表,但这意味着调用
GET/products
不会返回资源状态的表示(资源就是URL),因为主体用于提供过滤选项


请求已筛选的集合的最佳方式是什么,但筛选选项太长,无法使用查询字符串?

来自@C.Smith的有趣评论,他建议使用
X-HTTP-Method-Override
标题设置为
GET
,并在正文中传递
id
。这会奏效的

考虑到这一点后,我们可能会限制查询字符串中允许的类
id
,并建议进行多次调用,将
id
的列表分成200组。提交超过200个将返回一个错误

GET/products?class=100423428753…
(限于200个
id

GET/products?classes=232633436981…
(限于200个
id

然后,结果可以很容易地缝合在一起后


此方法允许您使用5000个
id
,例如,通过执行25个调用,这虽然不理想,但对于我们的用例来说是可以的。

有趣的问题!但是GET请求无论如何都不能保存有效负载……您可以将其设置为POST,并将筛选条件放入请求正文中,但使用请求头X-HTTP-Method-Override指示您希望将其视为GET。我认为这是一种规避由于各种原因而不允许的放置或删除的方法。看起来很合理,你也可以这样做。请参阅:@sp00m实际上请求可以保存有效负载,但它没有定义任何语义。此外,不建议包含任何有效负载,因为请求可能会被较旧的HTTP服务器拒绝。@RomanVottner哦,你说得对,谢谢你的评论!构建有效的请求不是客户的责任吗?我的意思是,API客户端应该能够使用一些合理的筛选条件限制(例如1000个实体)构建多个查询。此外,如果id通常是连续的,指定“范围”参数可能会有用。这取决于您的用例,但范围也可能有用,例如
[100-102]
而不是
100101102
id
几乎永远不会连续。