假设我有一个RESTful服务,它有一个任务列表。
GET mycorp/api/v1/tasks
这些任务中的每一个都可以有一个或多个上下文。
GET mycorp/api/v1/tasks?context=somecontext
在使用过程中,用户会删除一批任务。
DELETE mycorp/api/v1/tasks?context=somecontext
让我们假设一旦执行此操作,由于上面的DELETE操作,我们有几个现在在系统中孤立的上下文。让我们假设孤立的上下文可以保存用户必须一遍又一遍地输入相同的上下文。
如果用户DID想要明确删除这些上下文,那么在REST的上下文中执行此操作的正确方法是什么?我自然会倾向于两种选择。
DELETE mycorp/api/v1/tasks?context=somecontext&&deleteorphancontexts=true
还
DELETE mycorp/api/v1/contexts?isorphaned=true
我还是REST的新手,以及如何确保我构建的api是一种僵硬的感觉。
答案 0 :(得分:2)
首先,REST并不是一套严格的指导原则,因此没有明确的答案,但我认为它可以帮助您将不同的URL视为资源(这毕竟是REST的全部内容)
当您向服务器发送DELETE请求时,您指示它删除该位置的资源。在您的示例中,您假设要删除集合的内容,但实际上是在指示服务器删除集合本身。因此,如果您之后立即发出GET请求,您应该获得204(无内容)响应,而不是200响应空集合。如果这是合适的,那么你的问题就解决了。
在我看来,最好将DELETE请求用于单个上下文/任务,与PUT请求相反。通过发出包含删除指定内容的命令的POST请求来修改集合更为正确。
这样你可以POST到
MyCorp的/ API / V1 /上下文
并发送一个命令,指示服务器删除所有孤儿。
我更喜欢这个的原因是,您将上下文路径视为一个集合本身就可能是孤立的。
通常情况下,如果您有疑问,POST是您的朋友,因为它是HTTP的小丑。