如何重新公开相关的父子资源?

时间:2009-02-25 04:31:49

标签: api rest

我正在设计一个api,我想让用户和群组保存搜索,但我不确定如何最好地公开这些信息。我想出了几个URI来揭露它们:

# These are for CRUD the search definitions, not running the searches
1. /users/{username}/searches # lists the searches for a user
2. /users/{username}/searches/{search-name} # CRUD a specific user search
3. /groups/{groupname}/searches # lists the searches for a group
4. /groups/{groupname}/searches/{search-name} # CRUD a specific group search
5. /searches/{search-id|search-name}
6. /searches/group/{groupname}/{search-name}
7. /searches/user/{username}/{search-name}

我觉得公开所有这些URI是不对的。这意味着有两种方法可以更新或列出用户和组的搜索:通过/ groups / search或/ search / group。这也意味着更多的支持,我担心会产生微妙的差异。

搜索可以是数据库中的独立记录,而不是绑定到特定用户或组(例如,默认系统搜索或依赖于上下文的搜索)。

由于搜索可以是独立的,因此将其公开为/users/searches/groups/searches会感觉不对。与此同时,如果我在想,“什么是鲍勃的搜索?”我首先会想到/users/bob/searches,因为从逻辑上讲,它是 bob的搜索。同样,如果我想备份bob的帐户,他的所有个人信息都应该在/ users / bob下。

那么,是否有人建议他们选择哪种方式,和/或为他们做得好(或差)?

3 个答案:

答案 0 :(得分:3)

我倾向于坚持

5. /searches/{search-id|search-name}
6. /searches/group/{groupname}/{search-name}
7. /searches/user/{username}/{search-name}

备份问题可以通过创建一个新资源来解决,该资源包含整个系统中Bob信息的链接,例如

GET /AccountData/Bob

<div class="AccountData">
   <link rel="searches" href="/Searches/User/Bob"/>
   <link rel="options" href="/Options/User/Bob"/>
   <link rel="usagehistory" href="/History/User/Bob"/>
</div>

我的经验是,如果您尝试创建一个满足所有使用场景的单一层次结构,那么您将会疯狂。你不能这样做。这就是为什么Wikis工作得很好,他们使用链接而不是层次结构来提供对信息的访问。

我建议您更多地关注在表示中返回的链接。

e.g。

GET /Groups/{GroupName}

<div class="group">
  <div class="name">AGroup</div>
  <link rel="searches" href="/Searches/Group/AGroup"/>
</div>

使用这种方法,您更不关心URL结构的样子。正如罗伊所说here

  

REST API不能定义固定   资源名称或层次结构(   客户端和服务器的明显耦合)

我意识到这可能看起来像一个极端的位置,考虑到SO上的每个人似乎都注意到你的网址需要看起来像拥有RESTful API,但你想的越多,它就越有意义。

P.S。请不要把我选择的HTML作为表示的媒体类型,我只是提请注意你并不总是需要使用自定义XML词汇表。

答案 1 :(得分:0)

我的倾向是分成查询类型(例如,一种类型的查询是“列表搜索”查询。然后我会有参数。例如/ searchlist?user = john。除非你试图让这些东西被机器人和搜索引擎索引,这应该可以正常工作。

答案 2 :(得分:0)

搜索功能不是资源,因此您不必在资源URI中使用它可能在参数中,例如

/users/{username}?q={query string}
/groups/{groupname}?q={query string}

然后对于此查询字符串,您有2个选项

 "RQL" (Resource Query Language)

"FIQL" (Feed Item Query Language)