2011-09-02 66 views
2
/competitions/1/clubs/5/players 
/players/search?club_id=5 
/players?club_id=5 

什么时候应该为资源使用一流的URL,何时应该使用嵌套的URL?哪个URL描述资源最好?

更新1

感谢迄今答案。我会尽量澄清一些事情。

比赛和俱乐部有多对多的关系。俱乐部可以参加多项比赛。我想这将让俱乐部第一类实体,所以访问一个俱乐部的方式是例如:

/clubs/33 

但我也需要能够访问参与特定比赛的俱乐部,所以我需要类似这样的东西:

/competitions/2/clubs 

但有人提到它不建议通过多个URI来访问资源。这不违反吗?

而且,我相信这样的URI不会是可取:

/competitions/2/clubs/33/players/5 

而要用这样的:

/clubs/33/players/5 

俱乐部与球员一到一对多的关系。

+0

看起来第一个URL应该是'/ clubs/5/players'对称。 – 2011-09-02 19:51:29

+0

我改变了这个问题,因为没有或多或少的RESTful URI。 –

+0

我更新了我的帖子。 – Rits

回答

0

如果关系“感觉”树/目录明智(如俱乐部有玩家/clubs/berlin/players),我使用路径元素。参数是更多的“标签”,我经常用它来搜索过滤器(例如,年龄更老的“柏林”俱乐部的防守队员,比如22 /clubs/berlin/players?position=defender&age=22)。

我按'域重要性'设计URL结构。最基本的概念应该是根源。如果可能的话,不要在url-structure下面深入,我尽量不要复制或创建代表相同资源的别名集合(在代码+文档中花费双倍维护)。

一般把/俱乐部为根感觉更自然:/clubs/{club_id}/players

我只能通过/competitions/{comp_id}/clubs/{club_id}/players暴露的玩家,如果玩家设定的是/clubs/{club_id}/players,例如不同在比赛中 有几名球员被禁赛或没有参加比赛。

你是什么意思与​​?这是比赛还是单场比赛?如果与两个俱乐部单场比赛可能使用主场+客场概念:/competitions/{comp_id}/home-club/competitions/{comp_id}/away-club

更新1回答

这里我对您的更新问题的思考:

我猜/competitions/2/clubs/clubs一个子集,不是每个俱乐部在每一个比赛的竞争。所以这两个资源是不同的,所以两个URL是好的。

再次思考/competitions/2/clubs/33/players/5也应该没问题(但重要的是在服务器代码中避免重复)。当返回的资源是/clubs/33/players的子集时(例如,玩家受伤或者团队规模受到特定竞争的限制),该URL甚至应该是强制性的。

1
/competitions/1/clubs/5/players 

作为一个URI是一个单一的资源的标识,我会说,一般的规则是,如果它是一个对象,它获得了“一流的URL”。

我只倾向于在限制/过滤列表时使用查询参数,例如/competitions/1/clubs/5/players?gender=MALE

+0

+1对不需要的东西使用查询参数。 –

+0

路径段用于识别可自然分层组织的资源。查询参数适用于其他任何事情。 –

+0

@达雷尔我不是遵循OP给出的例子如何不是分层的。鉴于我们知道的信息有限,我认为这是因为他们需要属于特定俱乐部的球员列表,因此它适合于获得俱乐部以及该俱乐部的球员('/ clubs/5/players')。如果是我,那么这个资源就是玩家的URI列表('/ players/1','/ players/2'等)。如果该球员资源表示包含他们所属的俱乐部/俱乐部的信息,那么我同意查询球员将同样有效('/ players?club = 5')。 –

0

我不会把ID号码放在URL中。他们的意思只是为了那些真正了解他们的意思的人,但对于其他人来说,他们是无意义的数字。

您应该始终为您的网址选择描述性和相关词语,因为该网址有助于提供有关链接资源的信息。

而不是使用无意义的ID号,选择代表队或赛事之名的唯一名称,例如

/competitions/worldcup/clubs/usa/players 

但如果你真的需要发送那种匿名数据的URL,那么我宁愿在查询中看到它们。

仅为URL使用有意义的文本。