Twitter API *真的是* RESTful吗?

时间:2010-08-04 17:41:33

标签: rest restful-authentication

与一半的Web开发人员社区一起,我一直在努力真正地确定REST风格。更具体地说,我一直试图就一个纯粹的RESTful架构在Web浏览器和应用服务器之间的实际可行性形成一些看法。

作为我学习努力的一部分,我一直在看一些REST的在线示例,特别是在这种情况下的Twitter。在他们的API documentation中,他们讨论了各种“REST API方法”。

除了拥有RESTful URL结构之外,我正在努力合理化大多数这些实际上是RESTful。例如,考虑对 http://twitter.com/favorites 的简单GET请求。

在REST的纯实现中,我希望与该URL相同的请求(无论发起客户端)返回相同的响应。但是,在这种特殊情况下,我们显然会看到不同的响应,具体取决于我们当前经过身份验证的用户,这意味着我们的请求在生成响应之前已连接到服务器上的某种形式的客户端状态。

希望那为我的问题提供足够的上下文 - 真的可以称之为“REST”吗?我得到的印象是,Web浏览器和应用程序服务器之间90%的所谓RESTful实现都表现出同样的不一致性,其中忽略了存储在服务器上的客户端状态限制。

6 个答案:

答案 0 :(得分:23)

Twitter几乎破坏了每个REST约束。您http://twitter.com/favorites基于经过身份验证的用户返回不同结果的示例是Twitter违反“资源标识”约束的示例。每个有趣的资源都应该有唯一的标识符。我的Twitter收藏夹和您的Twitter收藏夹是两种不同的资源,因此应该有两个不同的URI。

这实际上与幂等性无关。幂等性是指能够多次发出相同的请求并且具有相同的效果。甚至Twitter都尊重幂等性。如果我多次获得我的最爱,我仍然会收到我的最爱。我做GET的次数不会影响结果。

Twitter还有许多其他方式可以打破REST限制。其中许多问题已经在此处讨论过。

<强>更新 仔细阅读Twitter api文档之后,实际上有一种替代URI格式可以正确识别收藏夹资源。 Here他们展示了如何创建如下网址:

http://api.twitter.com/1/favorites/bob.json

距离RESTful还有很长的路要走,但至少这是朝着正确方向迈出的一步。

答案 1 :(得分:5)

在这种情况下,幂等性是一个棘手的词。即使您正在检索单个推文,如果该推文可编辑且有人编辑它,您将得到不同的结果。检索列表时,我当然希望有一条推文来检索最新的列表。

将幂等性视为在不引起副作用的情况下做某事的能力可能更有帮助。因此,GET在这个意义上是幂等的,但POST不是。

From Wikipedia:

  

在计算机科学中,术语   幂等用于描述方法   或者可以安全地进行的子程序调用   多次调用,如调用   程序一次或多次   时间有相同的结果;即之后   所有方法调用的数量   变量具有与它们相同的值   在第一次通话后做了。任何方法   或没有副作用的子程序   也是幂等的。

另外from Wikipedia:

  

方法PUT和DELETE定义为   是幂等的,意思是多重的   相同的要求应该有   与单个请求相同的效果。

     

相比之下,POST方法不是   因此,必然是幂等的   发送相同的POST请求   多次可能进一步影响   陈述或造成进一步的副作用   (例如金融交易[例如,客户因同一产品被误收两次])。

另见:

我如何向妻子解释REST
http://tomayko.com/writings/rest-to-my-wife

答案 2 :(得分:4)

查看documentation,“方法”这个词的用法可能很好地表明该API是否真的是RESTful。有一些资源可能实际符合资格,例如friends/<user-id>favourites/<user-id>,但大多数资源实际上只是程序,例如account/update_profile_image

我看到它的方式,在REST中,一个URI应该只是指定一个的东西,而你要用做什么它。如果URI中有动词(例如 update ),则您很可能做错了。

答案 3 :(得分:3)

正如REST FAQ所解释的那样,术语“REST”用于涵盖各种各样的事物,包括以RESTful风格构建的有状态应用程序。因为状态主要是由用户在cookie中传递而不是存储在服务器上,所以它被认为是RESTful。 Roy Fielding(发明了REST)commented,只要整个状态由用户传递,而不是服务器上的状态引用,它就是RESTful,因为相同的GET请求将返回相同的结果。 Twitter的REST API接近这样做,但不是100%。它并不严格地说是“REST”的原始含义,但界面和一般哲学足够相似,它通常被拉到同一个伞下。

答案 4 :(得分:0)

技术上,不,它不是RESTful。一件事情不是stateless(a.k.a.幂等)。

答案 5 :(得分:0)

阅读Twitter API我已经理解RESTful API将在几周内过时。相反,您应该使用OAuth身份验证方法。