RESTAPI设计-资源列表以及如何仅引用列表中的一个资源

RESTAPI设计-资源列表以及如何仅引用列表中的一个资源,rest,restful-url,Rest,Restful Url,我正在设计一个RESTAPI接口,目前正在为如何为其中一个资源定义URI而挣扎 假设我有一个汽车资源/api/Cars,如果我做一个GET/api/Cars/Ford,我将得到一个福特生产的所有汽车的列表 现在我想买所有的福特车,但前提是那辆车的型号是蒙迪欧,所以我会做get/api/cars/Ford/model/Mondeo 这仍然会返回一个汽车列表,现在我想得到具体的福特蒙迪欧汽车,假设我可以通过它的序列号得到具体的卡。现在我要做一个GET/api/cars/Ford/model/Mond

我正在设计一个RESTAPI接口,目前正在为如何为其中一个资源定义URI而挣扎

假设我有一个汽车资源
/api/Cars
,如果我做一个
GET/api/Cars/Ford
,我将得到一个福特生产的所有汽车的列表

现在我想买所有的福特车,但前提是那辆车的型号是蒙迪欧,所以我会做
get/api/cars/Ford/model/Mondeo

这仍然会返回一个汽车列表,现在我想得到具体的福特蒙迪欧汽车,假设我可以通过它的序列号得到具体的卡。现在我要做一个GET
/api/cars/Ford/model/Mondeo/serial/1A2A2B

此外,假设在这种情况下,我不能仅使用
get/api/cars/1A2A2B
获取特定的汽车,因为该序列号可以与其他汽车相同,但不同的汽车工厂(因此一辆福特汽车可以与一辆标致汽车具有相同的序列号)

我不确定这是否是有效的URI表示形式


起初我有一个使用复合ID-s的想法,所以我会使用
GET/api/cars/Ford,Mondeo,1A2A2B
GET/api/cars/Ford,1A2A2B
来识别特定的汽车。这种方法的问题是,我无法定义URI来获取由生产商和型号定义的所有卡(
get/api/cars/Ford,Mondeo
),因为相同的URI模式已经被定义为通过生产者和序列号获得特定的汽车。

< P>你是否考虑了一个API,它更像是一个搜索,为基础API添加了过滤功能(就像你的数据库做的那样)? 例如,我会认真考虑这个问题:


/api/cars?出厂=eq=Ford&model=eq=Mondeo&serial=eq=1A2A2B

GET/api/cars
是一个列出api中所有汽车的资源,但是使用
1A2A2B
您可以通过一个或多个外国第三方
id
-方案引用汽车,而不使用api的id。所以那些身份证可能会冲突。也许福特会偶尔恢复它们?!
因此,在按id查找资源时,我会确保使用API本身提供的id,并且在您的情况下,再添加一个
/serial/1A2A2B

是的,但我不确定是否可以将其用于资源修补,例如…我明白了。我只是想到了GETAPI。为什么不使用完整地址进行PUT和修补操作:/api/cars/Ford/model/Mondeo/serial/1A2A2B。我假设客户端在这一点上有所有相关信息和/或考虑客户端可以使用的唯一ID:PUT/API/CARS/I在SSCRASS的回答中解释了为什么API不能使用它自己的资源。您认为这样的URI(/api/cars/Ford/model/Mondeo/serial/1A2A2B)是有效的RESTURI还是有效的URI?因为,对我来说,它看起来不像一个有效的URI,我不想获取模型资源或序列资源,我想获取汽车资源,模型和序列只是汽车ID的附加部分(是复合的)。但是我不明白为什么在这个特殊的情况下使用复合ID-s。你不能用一个唯一的福特前缀作为福特ID的前缀来创建一个合成ID吗?您的客户机将向您发送扩展id:您将对其进行解析并只发送他们的id。问题是API不能提供自己的id,因为API依赖于拥有资源并定义它的第三方系统。API不包含任何有关资源的信息,因此无法为资源生成自己的ID。此外,福特从不重复使用序列ID,第三方系统确保该ID可以唯一标识给定汽车品牌下的资源。