rest - 如何在不使用唯一标识符的情况下访问 REST API 中的子资源?
问题描述
我需要在不使用该资源的真正唯一标识符的情况下访问资源的子资源。
据我了解,您使用 Path-Variables 作为唯一标识符,使用 Request-Params 进行过滤。
如果我使用唯一标识符,URI 可能如下所示:
/cars/47/engine/name
但是,如果我想通过汽车的颜色获取汽车发动机的名称,我不知道该怎么做。由于颜色将是一个过滤器,因此查询必须看起来像这样:
/cars?color=red/engine/name
但这对我来说看起来有点奇怪,或者这实际上是传统的做法?
此外,我将如何使用资源的多个属性作为唯一标识符?想象一下,我有一个应用程序,我可以通过它的名字、sirname 和这个人出生的国家来识别一个人。我会像这样将它们链接在一起:
/persons/JoeWatsonSpain
或者我不能将它用作真正的唯一标识符并执行过滤逻辑吗?
/persons?firstname=Joe&sirname=watson&country=spain
解决方案
“但这在我看来有点奇怪(/cars?color=red/engine/name
)或者这实际上是传统的做法?”
不,此 API 设计不正确。根据RFC3986:
查询组件由第一个问号 ("?") 字符指示,并以数字符号 ("#") 字符或 URI 的结尾结束。
因此,您不能使用查询(或 RFC1738 中的前一个术语“searchpart”)并以/
.
更合适的方式是:
/cars/engine/name?carColor=red
“我如何使用资源的多个属性作为唯一标识符?”
有 2 个选项(可能更多):
- “将它们链接在一起”,使用您自己的单独规则。如:
/persons/Joe_SP_Watson_SP_Spain
- 使用您提到的查询。如
/persons?firstname=Joe&sirname=watson&country=spain
就个人而言,我更喜欢第二种方案,它更容易理解,也更容易维护。
推荐阅读
- android - ImageButton顺序动画的无限循环
- node.js - 在 CloudFront 分配创建结束时通知 Lambda
- if-statement - 计算多列中的值数组并返回每行总和
- html - 如何允许用户在 laravel textarea 中仅使用某些特定标签
- batch-file - 是否可以使用 Windows 批处理脚本按名称中的非常数来归档文件?
- javascript - JS:如何更改函数中的变量(IIFE)
- tensorflow - 为什么我的神经网络总是给我相同的预测?
- python - 如何获得熊猫列的特定百分位跨度?
- c# - 将 SQL 查询转换为 LINQ 或 LINQ fluent 语法
- c# - BoDi.ObjectContainerException:无法解析接口:OpenQA.Selenium.IWebDriver