2012-03-13 66 views
0

在我的资源模型中,我有一个“订阅”资源。它会经历生命周期状态,如“取消订阅” - >“订阅待处理” - >“订阅” - >“取消订阅待处理” - >“取消订阅”。发布到控制器资源 - 控制器的ID是控制器URI还是POST参数的一部分?

为了允许客户订阅或取消订阅订阅,我打算公开两个控制器资源(称为“sub”和“unsub”)用于订阅/取消订阅订阅,每个接受POST请求将同步放置目标订阅资源转换为适当的“等待”状态,并异步执行额外的工作以将订阅置入“订阅”或“未订阅”状态。

我可以想到几种方法让客户端在向“sub”或“unsub”发出POST请求时指定目标订阅。我可以把目标预订ID为URI,就像这样:

/订阅/ {subscription_id} /子 也许 /子/ {subscription_id}

[注:在URI露出订阅ID不会出现安全问题,我的应用程序]

或者,我可以让订阅ID的POST参数去:

/子

思考哪种方法最好?如果你更喜欢URI方式,你更喜欢哪种URI风格,为什么?

注意:已取消订阅的订阅随后可能会重新订阅,因此“取消订阅”操作不等同于删除订阅资源。

回答

0

我将ID作为POST参数到/ subscription。

而不是有一个单独/取消订阅资源,我会发送一个DELETE请求/订阅(以同样的方式传入ID)。

我选择了订阅而不是订阅者,因为订阅者在创建/删除订阅或实际订阅者/用户方面存在歧义。

编辑 - 后澄清。

REST使用动词GET,POST,PUT和DELETE。 GET在这里没有意义的创建/更新。你不想DELETE,因为你想让资源呆在里面。所以我会建议做一个POST来创建/启动一个订阅和一个修改/取消订阅订阅的PUT。这是对PUT动词的轻微误用,但我认为它比您的案例更适合您。

+0

感谢您的反馈意见。关于术语“订户”的含糊不清的好处;我会重新考虑这个名字。关于您的要点:对于我的应用程序,取消订阅不是删除 - 订阅在理论上可以在未来重新订阅。我没有提到这个问题。我最初认为要将“action = subscribe”或“action = unsubscribe”这样的表单参数传递给订阅资源,但从我读到的内容来看,这相当于隧道,这让人望而却步。这就是我带领两个控制器资源的方向。 – 2012-03-13 18:18:08

+0

注意:我更新了原始问题以重命名控制器资源,并澄清取消订阅!=删除。 – 2012-03-14 12:45:54

+0

为了响应您的编辑:在我的应用中,订阅通过POST创建到订阅集合。在预订操作的订阅资源上使用POST和取消订阅操作的PUT似乎不一致;两者的动词似乎都是可取的。我使用PUT来更改订阅的状态(不包括生命周期状态),例如改变名字。然而,我认为订阅/取消订阅是作为操作而不是状态改变(尽管状态受到影响),所以我倾向于POST,但是试图避免隧道,因此控制器资源。 – 2012-03-14 16:53:06

0

为了完整起见,我将根据进一步的研究和考虑给出另一个答案。最终,如果您遵循HATEOAS原则,除了顶级域名之外的URI对客户端来说是非常不透明的,因此从客户端的角度来看,控制者是否被识别并不重要控制器的URI或不。从服务的角度来看,作为一个实用和唯美的问题,将其从控制器的URI中排除出去会使它更短更简单,所以就是这样。另一方面,在URI中公开受控者将允许中间人(例如,路由器或防火墙)更容易检查并采取行动,在某些情况下可能有用。

对于我的项目,我最终决定在URI/subscription_tasks中公开一个控制器资源,接受包含动作(订阅/取消订阅)和目标订阅ID的POST作为POST有效内容中的表单参数。 POST返回一个subscription_task资源,该资源可以通过GET轮询进行监视,直到任务完成。