非RESTful设计的例子是什么?

15

作为一名Rails开发人员,我学习了“RESTful”这个术语。在阅读维基百科、这里这里之后,我还是不太明白。在我看来,Rails只是使用一种简洁的方式来描述URL。在它所设计的范围内,每个URI似乎都是RESTful的。

例如,我认为GET /delete?student_id=3在应用程序本身的范围内是RESTful的。

有人能告诉我它违反了哪个限制吗?请参考REST定义中的相关限制。

4个回答

16
一个GET请求应该是幂等的,并且该请求不应在服务器上留下任何副作用。引用自HTTP规范第9.1.1节

特别地,已经建立了一个惯例,即GETHEAD方法不应具有除检索之外的任何行动意义。这些方法应被视为“安全的”。这允许用户代理以特殊的方式表示其他方法(例如POSTPUTDELETE),使得用户意识到正在请求可能不安全的操作。

因此,GET /delete?student_id=3已经违反了GET动词的幂等性假设,因为它将在服务器上删除一条记录。
RESTful接口是一个统一的接口,换句话说,GET应该按照HTTP规范所要求的方式运作。这就是规范中所说的
  

GET方法表示检索由请求URI标识的任何信息(以实体形式)。如果请求URI引用数据生成过程,则应将产生的数据作为响应中的实体返回,而不是该过程的源文本(除非该文本恰好是该过程的输出文本)。

  

...


5
违反了HTTP规范,而不是REST规范。 - Cheng
1
@Cheng:是的,它不应该违反HTTP规范。如果它不符合某些规范,它就不再是一个统一的接口了。 - Daniel Vassallo
1
如果它符合我自己定义的规范怎么办?我可以只为方便起见遵循HTTP规范。没必要让应用程序成为RESTful。 - Cheng
1
@Cheng:理论上你是可以的。引用维基百科文章中的一句话:“REST最初是在HTTP的背景下描述的,但不限于该协议。如果其他应用层协议已经为基于传输有意义的表现状态的应用程序提供了丰富和统一的词汇表,则RESTful架构可以基于其他应用层协议。 RESTful应用程序最大化使用所选网络协议提供的预定义接口和其他内置功能,并将新的应用程序特定功能的添加最小化。” - Daniel Vassallo
因此,GET /delete?student_id=3 已经违反了 GET 动词的幂等性假设,因为它将删除服务器上的记录。这并不违反幂等性(DELETE 本身是幂等的),而是应该是安全的。 - Théophile
显示剩余2条评论

8
似乎Rails只是使用了一种简洁的方式来描述URL。在其设计范围内,每个URI都是RESTful的。

URIs既不是RESTful也不是非RESTful。REST是一种需要考虑整个应用程序的体系结构风格。

“GET”是检索请求的方法。如果您想将此放入REST论文的上下文中,则如果您的“GET”请求具有副作用,则会违反其他一些约束条件,例如缓存。

您还可以潜在地设计一个RESTful系统,其中“GET /delete?student_id = 3”请求会给您提供一个表示形式,告诉您(或要求您确认)是否要删除该学生,只要它不实际执行删除操作即可。

2

一个GET请求应该是RESTful的,但如果和DELETE请求结合使用,就会变得不安全。

因此,看起来符合RESTful标准,但实际上不符合。所以它没有通过"鸭子测试"


1

请参阅第5.1.5节。您的示例违反了统一接口约束。这是通过违反HTTP规范来实现的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接