需要帮助了解REST API端点

时间:2013-07-15 19:12:47

标签: api http rest

我不太了解如何合理地构建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. 对于将简报发送到列表,将用户添加到列表等操作,哪些端点是明智的?

  3. 以下是否有意义,是否为RESTfull?

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

    list/[id]/add/[id]通过PATCH添加或删除用户时,为列表添加list/[id]/remove/[id]/list/[id]端点是多余还是无用?

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

3 个答案:

答案 0 :(得分:8)

除了/list/[list_id]/add/[user_id]/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]

对于搜索,我会使用参数化网址获取资源列表,例如:

/newsletter/?name=dfjkhskdfh

答案 1 :(得分:1)

这些动词经常混淆:

  1. 要创建实体,请使用 POST
  2. 要更新 - PUT
  3. 可以通过以下方式处理这些事情:

    /lists/[list_id]/[user_id] - 执行发送信件,就像在集合中添加邮寄事实一样

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

    pointClickCallback - 从列表中删除用户。

答案 2 :(得分:0)

  

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

这很糟糕/无益。 REST的一个想法是端点是资源而不是远程过程调用(RPC)。 removelist/[id]/remove/[id]建议调用过程。

进一步的GET请求应该是无副作用的,也就是说,他们不进行任何更新。 Further Roy Fielding explains GET as

  

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

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

{{1}}的另一个非常危险的问题是,如果蜘蛛或您的测试框架绕过您的网站,它可能会开始删除项目。