11

我不太了解如何合理地构建 REST(或类似 REST)的 API。

想象一个用于创建和发送时事通讯电子邮件的 API。您可能有以下名词/资源:时事通讯(主题、正文等)、邮件列表(收件人的集合)和收件人(电子邮件地址和相关数据)。

因此,您可以使用 PUT 创建资源并返回其 ID:

/newsletter
/list
/user

您可以使用 GET 获取有关资源的信息:

/newsletter/[id]
/list/[id]
/user/[id]

您可以使用 PATCH 更新现有资源(或者这应该是 POST 吗?):

/newsletter/[id]
/list/[id]
/user/[id]

您可以使用 DELETE 删除资源:

/newsletter/[id]
/list/[id]
/user/[id]
  1. 以上是正确的吗?

  2. 哪些端点对诸如将简报发送到列表、将用户添加到列表等操作是明智的?

以下是否有意义,它是 RESTfull 吗?

/newsletter/[newsletter_id]/send/[mailinglist_id]
/list/[list_id]/add/[user_id]
/list/[list_id]/remove/[user_id]

当可以通过 PATCH 在 处添加或删除用户时,拥有列表list/[id]/add/[id]和端点是多余的还是无益的?list/[id]/remove/[id]/list/[id]

通过电子邮件地址或姓名等属性搜索用户 ID 怎么样?或者通过名称或创建时间等标识符获取列表?

4

3 回答 3

8

除了使用/list/[list_id]/add/[user_id]and之外,您几乎已经掌握了它/list/[list_id]/remove[user_id],因为您在 URL 中有动词——这就是 HTTP 方法的目的。将它们更改为,例如:

PUT (or POST) to /list/[list_id]/users/ for adding a user to the list

DELETE to /list/[list_id]/users/[user_id]

对于搜索,我会为资源列表使用参数化 url,例如:

/newsletter/?name=dfjkhskdfh
于 2013-07-15T19:30:56.303 回答
1

这些动词经常被混淆:

  1. 要创建一个实体,请使用POST
  2. 更新 - PUT

这些事情可以通过以下方式处理:

POST /newsletters/[newsletter_id]/mailinglists/[mailinglist_id]/mailingfacts- 执行发送信件,就像在收藏中添加邮寄的事实

/lists/[list_id]/[user_id]- 将用户添加到列表

/lists/[list_id]/[user_id]- 从列表中删除用户。

于 2016-05-19T14:00:16.713 回答
0

当可以通过at添加或删除用户时,拥有列表list/[id]/add/[id]的端点是多余的还是无益的?list/[id]/remove/[id]PATCH/list/[id]

这是不好的/无用的。REST 的思想之一是端点是资源,而不是远程过程调用 (RPC)。addremove建议调用程序。

进一步的 GET 请求应该是无副作用的,也就是说,它们不进行任何更新。Roy Fielding 进一步将 GET 解释为

检索应该代表某种资源的信息

所以 GET 仅用于检索,而不用于发送数据(即添加/删除哪个用户)。

另一个非常危险的问题list/[id]/remove/[id]是,如果蜘蛛或您的测试框架在您的站点周围运行,它可能会开始删除项目。

于 2018-05-01T16:01:53.030 回答