我正在设计一个REST API接口,我目前正在努力如何为其中一个资源定义URI。REST API设计 - 资源列表以及如何仅引用列表中的一个资源
可以说我有一个汽车资源/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模式来按生产者和序列号获取特定的汽车。
是的,我做了,但我不知道,我可以使用它的资源修补例如... – dplesa
我明白了。我只是想过GET api。为什么不使用PUT和PATCH操作的完整地址:/ api/cars/Ford/model/Mondeo/serial/1A2A2B。我假设客户在那个时候拥有所有相关信息和/或考虑客户可以使用的唯一ID:PUT/api/cars/ –
shlomi33
我在回答sschrass时解释了为什么API不能使用它自己的资源。你认为这样的URI(/ api/cars/Ford/model/Mondeo/serial/1A2A2B)是一个有效的REST URI还是?因为对我来说,它看起来不是一个有效的URI,我不是想要获取模型资源或串行资源,我想获取汽车资源,而模型和序列只是汽车ID的附加部分(这是复合材料)。但我只是不明白为什么如何在这个特定情况下使用复合ID-s。 –
dplesa