【问题标题】:What's a RESTful way to query with filters?什么是使用过滤器进行查询的 RESTful 方式?
【发布时间】:2016-09-23 21:54:39
【问题描述】:

假设我的应用程序正在管理称为工作负载的对象,其中包含以下字段。我想公开一个 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”的所有工作负载

根本不知道如何做这种rest api,除了要求用户分别按A,B,C查询然后自己进行适当的集合操作?

第二个查询是tracked as another question

【问题讨论】:

  • 我不认为查询参数有什么问题。你有什么理由想避开它们吗?
  • 我怀疑我是否想要/可以重复查询参数。当我在golang 中编写我的应用程序时,我正在使用third party libraryhttprouter 来帮助我自动解析参数,该参数目前仅支持单个查询参数......诸如workload/:workload_id/labels/:label_id

标签: rest api-design


【解决方案1】:

GET 动词不接受请求正文。你应该做一些类似'workload /labels/A, B, C'的事情。 然后,您在请求查询中获得 A、B、C。用逗号分隔请求查询并查找记录的数组。

【讨论】:

  • 1.我可以使用comma in URL。 2.如何在逗号分隔列表中查询“给我带有标签'A'或'B'但没有'C'的工作负载”?
  • @cookieisaac URL 中的逗号取决于服务器端路由实现,例如通过 node.js express 你可以有,通过 IIS 可能有问题。您需要先对其进行测试。
【解决方案2】:

使用查询参数,its finerepeat them

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

对于简单的情况,您也可以ornot 这样的术语。

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

【讨论】:

  • 这对于我的情况来说已经足够好了。只是想知道我是否可以发疯并做类似GET /workloads?(label=A||label=B)&label!=C 的事情?或者无论如何我可以做一些基本的逻辑操作,比如'(A或B)不是C'
  • 您可以尝试将其作为新问题发布。我想不出一个明显的解决方案。也许您需要另一个(一组)资源来定义您的查询,然后使用GET /queries/{id}/workloads 获取结果
  • @cookieisaac 以前有很多关于 URI 和逻辑运算符的问题,也许你应该检查一下。例如stackoverflow.com/questions/25749060/…
【解决方案3】:

这里有很多选项,唯一的限制是它们应该包含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 过滤器。

【讨论】:

  • 它看起来像是一个合法的解决方案,但我从未见过任何这样设计的 REST api...这些是 RESTful 端点的常规还是主要用于 URI?我一直在想像IBM Bluemix REST API 这样的思路,但它们似乎不支持复杂的查询......
  • @cookieisaac 如果您正在寻找标准解决方案,那么您应该检查 URI 模板 tools.ietf.org/html/rfc6570 。它定义了一个列表类型,它作为用逗号分隔的项目添加到 URI。遗憾的是,并非每个服务器都支持 URI 中的逗号,例如IIS 有问题。 Afaik 加号主要用于分隔搜索关键字而不是分隔列表项,因此据我所知,这只是一个提示,而不是约定。另一方面,URI 模板是一种标准,因此如果您的服务器支持,您可以用逗号分隔 id。查询字符串数组也是标准的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
相关资源
最近更新 更多