通过查询撰写组的安静方法是什么?

时间:2009-01-08 15:16:15

标签: web-services rest

考虑以下http请求:

GET /defects?group-by=priority

我希望将返回的缺陷集合(Feed)按其优先级进行分组。即退回的饲料包括缺陷(资源)和群体信息。

我想到了一些能够在返回集合之前返回群组标题和数量的东西,例如:

<content>
<Group val="High" count="567"/>
<Group val="Medium" count="437"/> 
<Group val="Low" count="19"/> 
<Defect ,,,,>
<Defect ,,,,>
<Defect ,,,,>
</content>

此类表示的问题在于查询的资源(URL)存在缺陷,因此客户端需要收集缺陷而不是Group元素。

我想解决这个问题的一个选择是为缺陷定义一个单独的组资源,即:

 defects/groups?group1=priority

将返回组的集合及其计数,然后客户端可以查询缺陷资源以获取数据本身。但是这种设计很麻烦并且需要额外的往返,更不用说在调用组资源和缺陷资源之间添加缺陷时可能出现的一致性问题。

最重要的是,返回按属性分组的元素集合的其他方法是什么?

编辑我首先想到这个问题应该通过ATOM发布标准来解决。但即使ATOM已经解决了这个问题,我仍然需要支持其他表示(XML,JSON),所以我在寻找RESTful方法中更为固有的模式。

3 个答案:

答案 0 :(得分:6)

我不认为你所要求的是可能的。

如果客户希望收集缺陷,那么您可以优先订购,但

a group of defects != a defect

因此您无法返回群组。

你可以添加一个讨厌的黑客来为缺陷资源添加属性优先级和优先级组大小,但这对我来说似乎很糟糕。

我认为正确的Restful方法是:

  • 将服务设计为返回组 缺陷

  • 退回缺陷 优先权,让客户做 分组和计算资源 在每个小组中。

答案 1 :(得分:1)

基于对this answer的评论,似乎需要支持分页。在这种情况下,我建议您查看AtomPub,具体说明handles paging。也许同样的一般方法对你有用;如果你真的很幸运,你可以利用整个标准。

答案 2 :(得分:0)

我设计了这样的网址:

GET /grouped-posts/category返回分组的帖子,例如:

{
    "data": {
        "science": [{"title": "post 1"}, {"title": "post 2"}],
        "art": [{"title": "post 3"}, {"title": "post 4"}]
    }
}

如果要按任何对象分组,则可以返回列表,而不是map / dict:

{
    "data": [{
        "category": {"id": 9202, "name": "science"},
        "posts": [{"title": "post 1"}, {"title": "post 2"}]
    }, {
        "category": {"id": 3924, "name": "art"},
        "posts": [{"title": "post 3"}, {"title": "post 4"}]
    }]
}