这是this one的后续问题。
对于任何给定的URI,RESTful架构的核心租户是否有唯一的响应?这里有很多讨论倾向于这个方向,但我没有把它看作是一个“硬而快”的规则。
我理解它的价值(用于缓存,抓取,传递链接等),但我也看到像twitter API这样的东西违反了它(对http://api.twitter.com/1/statuses/friends_timeline.xml
的请求会因给定的用户名而异),我理解有时可能需要 - 更不用说按时间顺序排列的页面资源也会随着新元素的添加而改变。
我是否应该努力从相同的URI中完全消除不同的响应,或者我只是接受有时它是不实际的,只要我最小化它的发生,我将处于不错的状态。
答案 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):
Accept
标头可用于确定响应的格式(HTML vs XML vs JSON)Authorized
标头至少可以确定是否返回401,403或200。 真正的问题是Authorized
标题(确定用户)是否可用于更改响应的内容。我没有看到任何关于它的官方声明,但我怀疑很多人宁愿让用户在URL中使用Authorized
标头来验证访问权限。我怀疑这两种方式仍然是RESTful。