REST与RESTful与“普通” Web服务-是否相同?


21

我已经阅读了关于REST和/或RESTful应用程序的一些定义和讨论,但是我仍然不了解它的真正含义。

我通常使用的应用程序要么通过GET获取数据,要么通过POST发送数据到某个Web服务(通常是PHP脚本),然后从数据库获取数据或将数据写入数据库。

现在,这是RESTful应用程序吗?如果没有,那么什么是RESTful应用程序?RESTful概念和我到目前为止合作过的概念有什么区别?请举例说明。

另外,有人在谈论REST,有人在谈论RESTful应用程序。我发现REST术语是指理论概念,而当我们谈论特定的应用程序时则使用RESTful。这是正确的做法还是REST和RESTful应用之间存在真正的区别?


1
如果您可以构建所有Servlet来仅从GET或POST参数中提取信息(在调用之前本地绝对没有保存任何内容),那么您正在正确地应用REST。换句话说,服务器在MVC中扮演模型的角色,因为它不受控制,而只是使用给出的内容来执行某些任务。希望能更好地解释它。
尼尔

@Neil我在另一边-移动应用程序。它是使用Web服务并通过POST和GET与之通信的客户端。所有Web服务都是由其他人构建的,而我所做的就是使用它们。但是术语使我感到困惑。因此,如果我正在使用HTTP通道和HttpGet / HttpPost对象,那么我正在处理RESTful应用程序,对吗?
deviDave 2012年

不必要。如果您不知道服务器的工作方式,则可能无法知道它是否是RESTful应用程序,因为它可能会违反某些约束。也就是说,如果返回一致的结果,则可能是RESTful。
尼尔2012年

@Neil哦,我明白了。RESTful在服务器上完成。如果我发送带有请求的post对象(而不是每个参数),则可能是一种REST方法。对于客户端(移动应用程序),它并不关心它是否是REST,因为编码是相同的。我说对了吗?
deviDave 2012年

2
RESTful既是服务器又是客户端,但是如果您只能看到客户端,则只能知道客户端是否遵守约束。这就是我的意思。REST的意思是,如果需要登录,请输入用户名和密码。服务器验证登录名并将用户哈希密钥保存在数据库中并返回。现在,每当您需要执行需要登录的操作时,便始终会传递用户哈希键。服务器“忘记了”已登录的您,但是使用用户哈希值来验证您的登录状态。如果不是RESTful,服务器将记住您已登录。了解其中的区别吗?
尼尔2012年

Answers:


13

RESTful应用程序的关键属性是:所有通信都是通过http GET,POST,PUT,DELETE进行的,并且所有项目都通过格式为标准的URL寻址,http://your.site.com/salesapp/salesperson/0000001/details即只有纯URL而没有参数等。该URL标识GET的内容,POST,PUT,DELETE标识您要执行的操作。

这样做的主要原因是您会自动拥有一个无状态服务,该服务可以进行负载平衡,故障转移等。

该方案非常简单,因此界面非常干净,使客户端与任何特定的后端实现完全脱钩。


哦,到目前为止,我还没有使用PUT或DELETE(移动应用程序通常只执行GET和POST),但这确实看起来像我目前所做的和正在做的。只是客户没有使用REST *术语,而是使用“ Web服务”和“ php脚本”
deviDave 2012年

2
詹姆斯,您能解释一下为什么要避免查询参数吗?例如,如何表达我希望以特定方式过滤资源而不引入错误的层次结构?
加里·罗

3
@GaryRowe:URL(无参数)标识您要操作的资源。您仍然可以具有参数,但是这些参数不会用于标识资源。例如,目录上的GET(以/结尾的URL)应返回目录中的资源列表。URL上的参数可用于指定过滤器或排序顺序等。
马丁·约克

1
谢谢,洛基。James可能想修改他的答案以反映这一点,因为看来他不允许在任何可能引起误解的情况下使用查询参数。实际上,有趣的发现是目录中的资源列表本身就是表达该概念的资源。
加里·罗

REST不需要应用程序基于URL,也不需要您具有诸如GET,POST,DELETE等动词。但是,对于WebApp,URL是唯一的选择,并且是上述动词。
纳瓦兹

6

REST代表代表性状态转移。如果您的软件符合REST约束,则将其视为RESTful。

是的,既然我已经毫不知情地从Wikipedia撕了,那这真的意味着什么?它实际上意味着使用内置的HTTP命令(例如GET,POST,PUT,DELETE和其他一些罕见的命令)在客户端和服务器之间来回通信。

您正在做的事情听起来像是RESTFul应用程序。但是,精心设计的垃圾邮件RESTFul Web服务之间存在很大的差异。例如,位于GET另一端的PHP代码可能会执行状态更改,由于将GET视为只读操作,因此将其视为错误。POST(新)和PUT(替换)的用法之间也有细微的差别。

Wikipedia上有关此的文章实际上非常好,所以我在这里停止。


到目前为止,我使用GET(HttpGet)来获取内容,并使用POST(HttpPost)来输入/更改数据库的内容。我将此参数作为参数发送到HttpPost,并且Web服务器上的PHP脚本将这些参数转换为SQL代码。这是RESTful应用吗?我对一个概念感兴趣,而不是对PHP脚本的完成情况感兴趣。我还没做到
deviDave 2012年

2
替换内容的情况下,我将调查PUT的使用,它比通常使用POST更惯用的REST。
Martijn Verburg 2012年

是的,在这种情况下,我将使用PUT。
deviDave 2012年

+1表示必须正确实现GET(即,幂等)。早期存在这样的根本性错误。
加里·罗

@deviDave您可能还需要研究旨在更新部分资源的PATCH。正如Martin正确指出的那样,PUT用于替换整个资源。
加里·罗

4

在继续之前,此相关问题可能会对您有所帮助

REST和RESTful之间的区别只是语义。REST是一种应用于客户端-服务器关系的体系结构样式。RESTful只是一种告诉客户您使用REST的方式。

许多Web应用程序自称是RESTful的,但实际上仅部分符合性REST约束(如的Martijn Verburg也在他的回答中引用)。我将在这里列出它们,但我强烈建议您阅读本文:

  • 客户端服务器
  • 可缓存
  • 分层系统
  • 按需代码(可选)

既然您提到自己是在客户端上工作,那么了解REST体系结构作为连接客户端将给您带来和期望的方面可能会有所帮助。尽管REST不是HTTP,但它是迄今为止支持REST的最流行的协议,因此,我将围绕它来举例说明。

您的客户将有望:

  • 使用HTTP动词(例如GET,POST,PUT,DELETE,OPTIONS,PATCH)执行相关操作
  • 提供Accept标头并了解Content-Type标头(例如,您收到一些以前从未见过的XML,但是您可以使用引用的XSD创建要呈现给用户的客户端域模型)
  • 遵循您理解的Content-Type中提供的链接(例如,让您的用户或您的应用程序推断<link rel="pay" href="http://example.org/orders(1)/payment">HTML中的状态转换以通过POST创建付款资源,而POST的正文包含一些表示付款细节(例如信用卡号)的XML ,金额等)
  • 对各种各样的HTTP状态代码做出正确的反应

如果执行上述操作,则可以认为它是REST客户端,您可能希望将其称为“ RESTful应用程序”,但这意味着您正在客户端使用REST,这是不正确的,因此最好避免术语。


3

RESTful表示接口是一组对象,可以读取和更新(可能删除)。那就是没有多参数查询(只有参数是您要读取的对象),只有一种类型的操作会更改服务器上的任何内容,即上载新状态。

这些限制确保所有请求都是幂等的(多次发送对发送一次没有任何额外影响)。这很重要,因为网络可能随时发生故障,无法传递任何请求或响应,对于幂等请求,您只需再次发送它,而不必进行复杂的恢复。


赞成第一段。简明扼要 谢谢!
deviDave 2012年

您还要再做一件事,看看我是否做对了。如果我(我的应用程序)是REST服务的客户端,那么作为客户端的我不区分服务是否为RESTful,因为我的编码始终相同(httpget,httppost等)?此原则仅对服务器脚本/应用程序的所有者重要吗?
deviDave 2012年

REST是用于设计接口语义的指南。无论接口是否为RESTful接口,底层技术都是HTTP(但是XML-RPC或SOAP等其他层与RESTful接口无关),因此您始终使用相同的httpget,httppost等。但是,处理网络故障的方式不同。
Jan Hudec 2012年

另外,SMTP是RESTful接口,尽管它使用了与GET,PUT等不同的动词以及不同的基础协议,但是概念是相同的-您将基于幂等动词的命令发送到服务器。
gbjbaanb 2012年

并非所有的REST请求都是幂等的。例如,多次发出POST将导致大量新资源。
加里·罗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.