2017-03-17 25 views
0

我正在设计一个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,1A2A2BGET /api/cars/Ford,1A2A2B来识别特定的汽车。这种方法的问题是,我无法定义一个URI来获取由生产者和模型(GET /api/cars/Ford,Mondeo)定义的所有卡片,因为已经定义了相同的URI模式来按生产者和序列号获取特定的汽车。

回答

0

你是否考虑过制作一个更像是搜索的api,并在基本api上添加过滤功能(就像你的数据库一样......)?

例如,我会认真考虑这一点:?

/API /汽车厂= EQ =福特&模型= EQ =蒙迪欧&串行= EQ = 1A2A2B

+0

是的,我做了,但我不知道,我可以使用它的资源修补例如... – dplesa

+0

我明白了。我只是想过GET api。为什么不使用PUT和PATCH操作的完整地址:/ api/cars/Ford/model/Mondeo/serial/1A2A2B。我假设客户在那个时候拥有所有相关信息和/或考虑客户可以使用的唯一ID:PUT/api/cars/ shlomi33

+0

我在回答sschrass时解释了为什么API不能使用它自己的资源。你认为这样的URI(/ api/cars/Ford/model/Mondeo/serial/1A2A2B)是一个有效的REST URI还是?因为对我来说,它看起来不是一个有效的URI,我不是想要获取模型资源或串行资源,我想获取汽车资源,而模型和序列只是汽车ID的附加部分(这是复合材料)。但我只是不明白为什么如何在这个特定情况下使用复合ID-s。 – dplesa

0

id

GET /api/cars是列出API中所有汽车的资源,但1A2A2B是由一个或多个外国第三方id-方案参考汽车,而不是您的API的ID。这些ID可能会发生冲突。福特甚至有时会重新使用它们?! 因此,当通过id查找资源时,我会确保使用由API本身提供的ID,并且在您的情况下另外创建一个/serial/1A2A2B

+0

问题在于API无法提供自己的ID,因为API依赖于具有资源并定义它的第三方系统。 API不包含关于资源的任何信息,所以它不能为资源生成它自己的ID-s。此外,福特从不重复使用序列号,第三方系统确保该ID可以唯一标识给定汽车品牌下的资源。 – dplesa