2

这是 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)

但后来我会得到一个非常浅的 URL 集。

谢谢

4

3 回答 3

2

您的第一个 api 没有任何问题。在很大程度上,RESTful 接口的想法是与 Web 的自然树结构相匹配,而您的第一种方法是与此保持一致。它也将是一种结构,可以完成 API 的工作,抽象出数据存储的隐式约束,因为第二种方法隐含地假设 note 的 id 是全局唯一的。这现在可能是正确的,并且可能仍然是正确的,但它也正是当发生某种重大数据库更改时突然出现并带来灾难性后果的那种错误。

我会选择你的第一个方案。这是一种熟悉的休息模式,很直观,而且不会以一种奇怪的方式爆发。此外,为了响应@Corwin01,最小化查询参数——它们不是那么 RESTful。

于 2012-06-29T17:36:32.767 回答
0

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

首先,这个问题有点缺陷。RESTful API,或者使用更受欢迎的术语超媒体 API 应该包括相关操作的 url,以便接口是可发现的并且更改不会破坏现有客户端,因此确切的结构比我放在它上面的重要性要低得多,这些可以以后改。

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

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

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

于 2012-07-13T18:46:39.927 回答
-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,因为无论如何用户都不需要看到它。

于 2012-06-29T17:27:58.040 回答