具有集合的资源的REST URL ID放置

时间:2012-06-29 17:12:27

标签: rest restful-url

这是一个很好的REST URL结构吗?

假设:

GET /account  <- get list of accounts
GET /account/1234 <- get account 1234

如果帐户资源有我想要联系的集合,这是个好主意吗?

GET /account/1234/note <- get notes for account 1234
POST /account/1234/note <- add note to account 1234
DELETE /account/1234/note/321 <- delete note 321 on account 1234

特别是最后一个让我停下来;通常我在删除时不需要实体ID和父ID。

或许这样的事情会更好?

GET /account-note/1234 <- get notes for account 1234
POST /account-note/1234 <- add note to account 1234
DELETE /account-note/321 <- delete note 321 on account 1234 (b/c note 321 is on account 1234)

但接下来我的网址设置非常浅。

由于

3 个答案:

答案 0 :(得分:2)

你的第一个api没什么问题。在很大程度上,RESTful接口的想法是使用Web的自然树结构,并且您的第一种方法是与此保持一致。它也将是一个结构,它可以完成API抽象数据存储区隐式约束的工作,因为第二种方法隐含地假设注释的id是全局唯一的。现在这可能是真的,并且可能仍然是真的,但它也正是那种突然出现的带来灾难性后果的错误,当时,某种类型的主要数据库更改发生了。

我会选择你的第一个计划。这是一个熟悉的休息模式,它是直观的,它不会以一种奇怪的方式炸毁。另外,响应@ Corwin01最小化查询参数 - 它们不是那么RESTful。

答案 1 :(得分:0)

我在另一个问题的评论中以及我在那里得到的反馈和我自己的研究之间引用了这个问题。这就是我想出来的。

首先,这个问题有点瑕疵。 RESTful API,或使用优势术语Hypermedia API应包括相关操作的URL,以便界面可被发现,更改不会破坏现有客户端,因此确切的结构比我放置它的重要性要小得多,这些可以稍后改变。

其次,示例中的注释将作为帐户查询的一部分进行检索,可能是这样的:

<account>
   ...
   <notes>
      <note>
         ...
         <link href="/account-note/123" rel="note">
      </note>
   </notes>
</account>

客户端永远不会自己将URL汇集到帐户,客户端将使用提供的链接。由于在这种情况下笔记ID是全局唯一的,因此不需要包括密钥两次。因此问题的答案是否定的,第一个例子不是一个好的REST网址结构,第二个例子更好。 (虽然可能不是最好的...)

答案 2 :(得分:-1)

请注意,我的经验是JAX-RS和Jersey,所以我不确定具体的区别是什么。

然而,这就是我要做的事情:

    @GET
    @Path ("/account/note/{id}")
    public void displayNotes(@PathParam ("accountId") String accountId)
    {
      //do stuff
    }

    @POST
    @Path ("/account/note")
    public void addNote(@FormParam ("accountId") String accountId)
    {
      //do stuff
    }

    @POST
    @Path ("/account/note/delete")
    public void deleteNote(@FormParam ("accountId") String accountId, @FormParam ("noteId") String noteId)
    {
      //do stuff
    }

这样,您就不会有用户不需要看到的混乱和混乱的URL,尤其是当用户尝试自己导航时。这对于显示帐户是可以的,但是会将它们混淆为POST的URL,因为它们会得到404而不理解为什么。

保持简单,只需用户@FormParams,因为无论如何用户都不需要看到它。