RESTful搜索深层嵌套资源

时间:2018-10-06 09:15:58

标签: rest api web-services

我需要实现一种搜索,这种搜索在我看来比RESTful服务更适合SOAP,因此我正努力将其表示为REST端点。

域模型

Company( companyId
合同(合同编号,公司编号,privacyGroupId)
PrivilegeGroup( privilegeGroupId ,privilegeId)
特权( privilegeId

主键以粗体显示。

以SOAP术语搜索

findPrivilegesByCompanyId

RESTify SOAP请求

我已经尝试通过多种方式将查询查询到某种REST请求,但由于特权和公司之间没有直接关系,因此没有什么能说服我。
实际的关系由以下长URI表示:

/ companies / {companyId} / contracts / privileged-groups / privileges

但是,即使此URI讲真话,将其公开给API客户端也不是一个好主意。因此,我正在尝试提出一些替代方案:

  • 获取/ companies / {companyId} /特权
  • 获取/ privileges / search?companyId = {companyId}

关于如何处理这些情况的任何想法?如何在RESTful API中表达这类查询?可能吗我认为从理论上讲,此查询的结果甚至不是REST的资源。

注意:API已经为域模型的每个对象公开了CRUD操作。

2 个答案:

答案 0 :(得分:2)

  

我认为从理论上讲,此查询的结果甚至不是REST方面的资源。

It is

  

REST中信息的关键抽象是一种资源。任何可以命名的信息都可以是资源

在REST中,URI只是资源的标识符。例如,如果我们想检索Acme Corporation的特权,则此URI完全是“轻松的”

/7B7F1B30-7A84-4406-8D88-FAC9B647AC12

拼写与REST无关。

您的实现框架以及您的API使用者可能更喜欢hackable URI;但这不是REST约束。

此外,没有REST约束要求域模型中的每个实体都具有一个且恰好一个URI。 “您的资源模型不是您的域模型”。

简而言之,如果您有一个可以生成此查询结果表示形式的端点,并且需要将一个公司ID编码到标识符中以进行查找,那么这些都是 fine

/7B7F1B30-7A84-4406-8D88-FAC9B647AC12/{companyId}
/7B7F1B30-7A84-4406-8D88-FAC9B647AC12?{companyId}
/{companyId}/7B7F1B30-7A84-4406-8D88-FAC9B647AC12
/7B7F1B30-7A84-4406-8D88-FAC9B647AC12;{companyId}

困难的部分是尝试选择语义上重要/可识别的拼写;本质上与尝试在代码中命名变量时遇到的问题相同,并受到类似的限制-即:编译器不在乎它们,您正在编写与其他人的清晰通信

您可能会在支持用例的情况下寻求有关拼写的想法,但是很可能您在提供某种“摘要”特权,类似于帐户摘要或资产负债表。

答案 1 :(得分:0)

如果感觉资源之间没有直接关系,则可以使用查询参数基于另一个资源进行过滤。 例如:/ privileges?company_id = $ company_id

(IMO,您在示例网址中提到的 search 字词在这种情况下是不需要的。即使搜索发生了,也可以将其视为使用其他资源ID的过滤器)