使用过滤器查询的RESTful方法是什么?

时间:2016-09-23 21:54:39

标签: rest api-design

假设我的应用程序正在管理名为工作负载的对象,并带有以下字段。我想公开一个REST接口,供用户按标签查询工作负载。

"Workload": {"id":"test1", "labels":["A", "B", "C"]}
"Workload": {"id":"test2", "labels":["A", "C", "D"]}
"Workload": {"id":"test3", "labels":["A", "B", "D"]}

问题:如何设计REST端点,以便多个标签作为过滤器支持查询工作负载?

示例查询1 :我想GET所有带有“A”和“B”的工作负载。

我正在考虑使用GET作为动词,workloads作为端点,然后使用{"labels": ["A", "B"]}作为请求正文。但这似乎不是一种RESTful方式来做事

或者,我可以GET /labels/{label-id}/workloads但这只能在每次使用一个标签时使用。

示例查询2 :我想GET标签为“A”或“B”但没有“C”的所有工作负载

除了要求用户分别通过A,B,C查询然后自己进行适当的设置操作外,根本不知道怎么做这种休息api?

第二个查询是tracked as another question

3 个答案:

答案 0 :(得分:1)

GET动词不接受请求正文。你应该做'工作量/标签/ A,B,C'之类的事情。 然后,您在请求查询中获得A,B,C。使用逗号分隔请求查询并查找记录。

答案 1 :(得分:1)

使用查询参数,its finerepeat them

GET /workloads?label=A&label=B&label=C

对于简单案例,您还可以ornot这样的字词。

GET /workloads?or_label=A&or_label=B&label_not=C

答案 2 :(得分:0)

您有很多选项,这是唯一的约束,它们应该包含AB。例如,

  • /workloads/?label=["A","B"]
  • /workloads/?label[]=A&label[]=B - 又名。 query string array
  • /workloads/by/label/A+B/
  • /label/A+B/workloads/

现有URI查询约定,例如Microsoft Odata。 http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part2-url-conventions.html我不熟悉OData,但根据文档,如果您想要遵循他们的方法,您应该使用类似/WorkloadsByLabels(labels=@c)?@c=["A","B"]的内容。据我所知。没有标准的解决方案来描述复杂的URI过滤器。