假设我的应用程序正在管理名为工作负载的对象,并带有以下字段。我想公开一个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?
答案 0 :(得分:1)
GET动词不接受请求正文。你应该做'工作量/标签/ A,B,C'之类的事情。 然后,您在请求查询中获得A,B,C。使用逗号分隔请求查询并查找记录。
答案 1 :(得分:1)
使用查询参数,its fine至repeat them。
GET /workloads?label=A&label=B&label=C
对于简单案例,您还可以or
和not
这样的字词。
GET /workloads?or_label=A&or_label=B&label_not=C
答案 2 :(得分:0)
您有很多选项,这是唯一的约束,它们应该包含A
和B
。例如,
/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过滤器。