我是REST API设计的新手。在设计API时,我对资源关系感到困惑,需要建议。
我的API有一个工作流程,每个工作流程都有一个任务。我无法决定将任务保持为独立资源还是将其用作子资源。更确切地说:
工作流程资源:
/ API / V1 /工作流
任务资源:
选项1: 的 / API / V1 /工作流/ {workflowId} /任务/ {的TaskID}
选项2: 的 / API / V1 /任务/ {的TaskID}?workflowId =” 123”
我经历了一些堆栈溢出链接。有人说,queryString作为一个过滤器,应该是可选的,有利于使用子资源,而其他人更喜欢将任务保持为一个独立的资源,并使api url变小。
我觉得还有另一种方法可以将taskId和workflowId映射保留在我们的数据库中并让用户使用:
选项3: 的 / API / V1 /任务/ {的taskid}
但这似乎是维护映射的一大努力。
建议?
答案 0 :(得分:1)
在REST中没有“子资源”这样的东西。一切都是自己的资源。也就是说,最好提出对用户有意义的网址,也方便自己。
如果任务始终是工作流程的一部分,则没有任何问题:
/workflow/abc/task/xyz
但这也完全没问题:
/task/xyz
这个绝对对我来说不寻常:
/tasks/{taskId}?workflowId=123?
因为如果我没有通过workflowId会发生什么?通常,查询参数确实用于搜索。我不能说这是否一定不稳定,但这似乎是一个坏主意。
因此,在前两者之间,客观上更好或更安静的方面没有区别。无论如何客户都不应该猜测它们,应该总是发现它们。
我个人会采用更深层次的结构,因为我认为网址更有用,更具描述性;但这是主观的。