2012-01-08 137 views
4

一个最佳实践问题。如果您正在设计RESTful界面,您将如何区分子类型。例如。你的应用程序有动物(每只动物都由它的animalId标识)和狗和鸟的亚型,其中每个亚型都有其特定的子资源。例如。狗有尾长和鸟翅长(无论它可能是什么)。你会选择哪些(或者你有没有想到更好的方法)?RESTful子类资源

1) 
/animals/{animalId}/tail-length (400 when animal is bird) 
/animals/{animalId}/wings-length (400 when animal is dog) 

2) 
/dogs/{animalId}/tail-length 
/birds/{animalId}/wings-length 

3) 
/animals?type=dog/{animalId}/tail-length 
/animals?type=bird/{animalId}/wings-length 

回答

3

假设不存在不同子类之间的ID共谋,我会推荐以下内容。

GET /animals/:id

有了这样的反应。 (这个例子是JSON,但可以很容易地是XML /等)

{ 
    "id": "xyz", 
    "type": "dog", 
    "tailLength" 400 
} 

这使它简单和RESTful。

+1

+1简单胜。 – cmbuckley 2012-01-10 00:43:31

+0

好吧,我同意这一点。另一个问题。那么你有什么特殊类型的子实体呢?例如。/animal /:id/subentity /:sid(例如只有狗)。那么如果身份证下的动物是鸟,你会返回400 ...或者? – d1x 2012-01-11 01:28:43

+0

这应该是404。 – cmbuckley 2012-01-11 10:24:39

1

这实际上是个人喜好的问题。

我个人避免将信息放在查询字符串中,就像选项3一样,因为我倾向于将查询字符串用于非分层信息。 (接受的答案this question表示前两个更正确,而最上面的答案表明它确实没有关系。)

缓存也是一个因素,因为代理可能不会缓存包含查询的资源字符串(请参阅Google's advice on leveraging proxy caches)。

我想我会选择第二个,也许是混合(/animals/dogs/...)来表明您的资源的层次结构,但这取决于您。