RESTful架构的局限性

时间:2012-08-29 20:18:38

标签: ruby-on-rails rest

我想知道人们在多大程度上保持他们的应用程序RESTful。在我看来,事情很容易崩溃,在这一点上,我必须做一个高级程序员曾经告诉我的事情,当我在我的职业生涯中是新的并且在他身上得到所有的哲学建筑时:“只要写下该死的代码。” / p>

具体示例,我在Rails应用程序中实现自定义身份验证,并且我有一个标准的“密码提醒”表单。从REST的角度来看,我们在流程结束时要做的就是在User对象上进行PUT,因为我们正在更新用户对象。但是,即使忽略了您可能想要更新用户的多种方式(参见How to do REST-ful updates?),我们也不知道我们在一开始就更新了哪些用户,最后我们将发送出去电子邮件确认并使用用户标识符+安全密钥关注链接。所以现在最终触发用户更新的事情是一个简单的链接(哦,恐怖!) - 否则我必须用另一个按钮来骚扰我的用户,以便成为RESTful。

这只是提出我问题的一个例子,但在我看来,在任何非平凡的应用程序中,肯定会有数十个此类案例。

人们几乎都使用RESTful archietectures作为巧妙的程序员根据需要忽略的一般准则吗?我从文献中得到的印象与此完全不同 - 因此关于你如何处理例外的问题。感谢。

(实际上在我看来,在这种情况下,最终结果将是另一种带有新密码/确认的形式,其目标可能是PUT,但我一般认为这有时候很笨拙仍然在我身边。也许那是我自己的缓慢 - 不会是第一次。)

2 个答案:

答案 0 :(得分:1)

在我工作的地方,我们决定尝试尽可能地保持RESTful,但是我们也将是务实的,当某些事情不符合REST准则时(所有参与者都同意这种情况),那么愿意分歧。说,我认为你可以使大多数用例有点RESTful。

如果您不知道用户的ID,那么这样的事情怎么样?一组更改密码令牌,其ID为电子邮件地址:

GET /changepasswordtoken/{userEmail}

或者,如果API的客户端知道用户ID,那么可能更好:

GET /user/{userId}/changepasswordtoken

您要求GET用户的更改密码令牌。如果这是一个面向公众的API,那么显然你不会在响应有效负载中返回它,但有效负载可能会返回一条消息“更改密码发送到电子邮件”或其他内容。

然后使用更改密码令牌更新密码PUTPATCH作为查询字符串参数。

PUT /user/{userId}?changepasswordtoken=xyz

{
     "password": "new password"
}

答案 1 :(得分:0)

来自http://www.ics.uci.edu/~fielding/pubs/dissertation/web_arch_domain.htm#sec_4_4

  

REST提供了一组体系结构约束,当作为一个整体应用时,强调组件交互的可伸缩性,接口的通用性,组件的独立部署以及中间组件,以减少交互延迟,实施安全性并封装遗留系统。 / p>

如果你需要一种强调模仿演员和资源的架构风格,点对点的一次性互动,以及全心全意地接受和接触遗留系统(如HTML电子邮件),那么不,你不需要要RESTful。找到(或发明)符合您标准的建筑风格。 REST没有什么神奇之处;它是一组适用于许多问题域的约束,因为它是为满足其需求而设计的。如果你有不同的需求,应用相同的约束会适得其反,也很愚蠢。