我不太了解如何合理地构建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]
以上是否正确?
对于将简报发送到列表,将用户添加到列表等操作,哪些端点是明智的?
以下是否有意义,是否为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?或者通过标识符(如名称或创建时间)获取列表?
答案 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)
这些动词经常混淆:
可以通过以下方式处理这些事情:
/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)。 remove
或list/[id]/remove/[id]
建议调用过程。
进一步的GET请求应该是无副作用的,也就是说,他们不进行任何更新。 Further Roy Fielding explains GET as:
检索应该代表某种资源的信息
因此GET仅用于检索,而不用于发送数据(即添加/删除哪个用户)。
{{1}}的另一个非常危险的问题是,如果蜘蛛或您的测试框架绕过您的网站,它可能会开始删除项目。