RESTful架构中的给定URI是否应始终返回相同的响应?

时间:2010-04-20 16:18:52

标签: rest uri

这是this one的后续问题。

对于任何给定的URI,RESTful架构的核心租户是否有唯一的响应?这里有很多讨论倾向于这个方向,但我没有把它看作是一个“硬而快”的规则。

我理解它的价值(用于缓存,抓取,传递链接等),但我也看到像twitter API这样的东西违反了它(对http://api.twitter.com/1/statuses/friends_timeline.xml的请求会因给定的用户名而异),我理解有时可能需要 - 更不用说按时间顺序排列的页面资源也会随着新元素的添加而改变。

我是否应该努力从相同的URI中完全消除不同的响应,或者我只是接受有时它是不实际的,只要我最小化它的发生,我将处于不错的状态。

3 个答案:

答案 0 :(得分:2)

不是相同的响应,而是相同资源的表示(取决于连接和条件请求标头)。在Rest架构中,URI标识一个且仅标识一个资源(但资源可以具有多个URI)。根据授权用户(HTTP身份验证,cookie,...)呈现不同的资源是不好的做法,因为相同的URI代表每个用户的不同资源,如Twitter示例中所示。我不能允许您查看我的时间轴并为您提供URI,因为这与您的时间轴的URI相同。用户必须在URI中编码,并且访问受授权机制限制。要使单个访问点根据经过身份验证的用户显示不同的资源,请使用重定向(例如303 See Other,302 Found,...)

答案 1 :(得分:0)

REST中没有任何内容表示同样的响应 - 但是你应该准备好处理诸如“如果修改后的”请求标题之类的东西,当它们发生感觉时;)

tritter API显然还有其他问题 - 例如:这是一个设计决策。例如,一旦你允许朋友时间表被隔离,将时间线放在朋友名字元素下面是有意义的 - 他们显然决定反对这个;)

它贯穿于设计决策。查看OData(如http://odata.netflix.com/Catalog/) - 这里它使snse为给定时间(缓存)的每个URL返回相同的数据,因为它是一个完全公开的目录。对于其他情况,它可能毫无意义。

答案 2 :(得分:0)

某些请求标头确实会更改返回的内容(同时仍为RESTful):

  1. 显然,缓存标题应用于确定是否返回304或200
  2. Accept标头可用于确定响应的格式(HTML vs XML vs JSON)
  3. Authorized标头至少可以确定是否返回401,403或200。
  4. 此外,资源可以随时间变化。
  5. 真正的问题是Authorized标题(确定用户)是否可用于更改响应的内容。我没有看到任何关于它的官方声明,但我怀疑很多人宁愿让用户在URL中使用Authorized标头来验证访问权限。我怀疑这两种方式仍然是RESTful。