我需要实现一个搜索,在我的脑海中听起来比 RESTful 服务更适合 SOAP 服务,所以我正在努力将其表达为 REST 端点。
域模型
Company(companyId(Contract(contractId, companyId, privilegeGroupId(PrivilegeGroup(privilegeGroupId, privilegeId(Privilege(privilegeId(
主键以粗体显示。
在 SOAP 术语中搜索
findPrivilegesByCompanyId
RESTify SOAP 请求
我已经尝试以多种方式将此查询锤炼为某种 REST 请求,但没有什么能真正说服我,因为特权和公司没有直接关系。
实际关系由以下长 URI 表示:
/companies/{companyId}/contracts/privileged-groups/privileges/privileges
但是,即使此 URI 说的是实话,将其公开给 API 客户端似乎也不是一个好主意。所以我试图想出一些替代方案:
- GET/companies/{companyId}/privilege
- GET/privileges/search?companyId={companyId}
关于如何处理这些情况的任何想法?如何在 RESTful API 中表达这些类型的查询?甚至可能吗?我认为从理论上讲,此查询的结果甚至不是 REST 术语中的资源。
注意:API 已经公开了域模型的每个对象的 CRUD 操作。
理论上讲,这个查询的结果甚至不是 REST 术语中的资源。
是的。
REST 中信息的关键抽象是资源。任何可以命名的信息都可以是资源
在 REST 中,URI 只是资源的标识符。 例如,如果我们想检索 Acme Corporation 的特权,这个 URI 是完全"休息的"。
/7B7F1B30-7A84-4406-8D88-FAC9B647AC12
拼写对 REST 无关紧要。
您的实现框架和 API 使用者可能更喜欢可破解的 URI;但这不是 REST 约束。
此外,没有 REST 约束要求域模型中的每个实体都有一个且恰好有一个 URI。 "您的资源模型不是您的域模型"。
简而言之,如果你有一个生成此查询结果表示形式的终结点,并且你需要将公司 ID 编码到标识符中以执行查找,那么这些都可以。
/7B7F1B30-7A84-4406-8D88-FAC9B647AC12/{companyId}
/7B7F1B30-7A84-4406-8D88-FAC9B647AC12?{companyId}
/{companyId}/7B7F1B30-7A84-4406-8D88-FAC9B647AC12
/7B7F1B30-7A84-4406-8D88-FAC9B647AC12;{companyId}
困难的部分是试图选择一个语义上重要/可识别的拼写;本质上,当你试图在代码中命名一个变量时,你会遇到同样的问题,并受到类似的限制——即:编译器不在乎,你正在写作是为了与其他人清楚地交流。
您可能会查看您支持的用例以获取有关拼写的想法,但您可能正在提供某种特权"摘要",类似于帐户摘要或资产负债表。
如果您觉得资源之间没有直接关系,则可以使用查询参数基于其他资源进行筛选。 例如:/privileges?company_id=$company_id
(IMO,在这种情况下,您不需要在示例 URL 中提到的单词搜索。即使搜索是发生的情况,也可以将其视为使用另一个资源 ID 的筛选器(