PHP中的REST与RPC对比

40
我正在构建自己的Ajax网站,正在考虑使用REST和RPC。
如果我的服务器支持Servlets,我只需安装persevere即可解决问题,但我的服务器不支持Servlets。
在我看来,RPC编码更简单,并且可以很容易地用PHP编写。我只需要一个数据库查询执行器。我正在使用Dojo Toolkit和JSON。
为什么我应该选择REST而不是RPC或RPC而不是REST?

3
不理解为什么Stack Overflow正在大量关闭对于开发者有着重要影响的问答。 - minghua
3个回答

55
了解REST的最佳方法是阅读Roy T. Fielding关于它的论文,或在他的博客中阅读相关文章,他在其中讨论了纯REST和简单RPC架构之间的区别。
还要注意的一点是,维基百科上关于REST的文章状况不佳,REST的“发明者”Fielding本人也认为这篇文章是不准确的。
人们在使用REST时最容易忽略的是可发现性——资源应该包含有关其超文本中其他相关资源的URI,而不是依赖于URI命名约定,这些约定是非标准的。
像SOAP或XML-RPC这样的流行RPC实现的一个大问题是,它们在自己的专有架构下使用HTTP,而不是利用HTTP的所有不同属性,如PUT、GET、DELETE等。因此,这并不适合传统的Web堆栈,例如,中间的缓存服务器不能正常工作,而不知道RPC调用的内容含义。
这只是REST和RPC的不完整介绍,但我认为我已经突出了一些经常被忽视的重要点。要小心,因为有很多关于REST的错误信息存在。
话虽如此,REST并不是万能的。它是一种架构,所以你可以相当灵活地实现它。但如果将事物主要作为资源访问不合理,则REST可能不适合,或者它只适用于你的应用程序的某些部分,这也是可以的。

超媒体控制器显著提高了REST服务的可发现性。 - Amir
6
想指出你所称的“普遍 RPC 的一个大问题”也可能成为一个巨大优势,这取决于你的目标是什么。如果你依赖 HTTP 的动作动词,那么现在就与 HTTP 绑定在了一起。在许多系统架构中,可能希望使用各种不同的传输机制进行 RPC 调用(如 HTTP、套接字、消息队列等)。通常我们选择 HTTP 更多是因为它的普及性,而不是它实际上是最理想的传输协议(参见众多浏览器解决方案通过 HTTP 进行隧道传输的情况,例如 BOSH)。有很多权衡需要考虑。 - DougW
@DougW,完全正确。有办法在没有HTTP的情况下使用REST,但我不知道是否有协议无关的REST。 - aehlke
3
REST与RPC实际上是一个虚假的二元对立,当人们询问这个问题时,通常意思是在暴露服务时是否要使用基本的HTTP RESTful方式,还是使用RPC构建更加定制化的接口。我经常看到这个问题被提出;你可能会发现这篇文章有所帮助:http://www.etherealbits.com/2012/12/debunking-the-myths-of-rpc-rest/. - Tyson

29
Uhm...简单来说,两者都是非常抽象的模型......如此抽象,它们自然而然地无处不在。
REST是拥有全局标识符(在HTTP的情况下为URI)的资源的思想,以CRUD方式访问这些资源(在HTTP的情况下使用POSTGET,PUT和DELETE...好吧,至少这是这个思想)......
RPC是一种思想,在其中调用不同机器上的过程,传递一些参数并获取返回值...... 维基百科上有一个很好的短比较 Persevere创建了一个服务,以非常优雅的方式同时允许两者存在......它是RESTful的(尽管它不仅使用HTTP功能来实现这一点),并且公开了一个RPC接口......
最终,您应该考虑您的应用程序需要做什么...像大多数人一样,您可能最终会得到一个基于XMLJSON等的RPC API,其中包括部分RESTful子系统的传输层...这是因为具有RESTful性意味着灵活性...如果客户端可以通过一组简单的CRUD方法在服务器上更或多或少地遍历数据,则不依赖于通过API公开的有限(问题特定)方法集,并且可以将逻辑移至客户端...

27
REST与CRUD无关。 - aehlke
10
有人可能会误以为REST与CRUD有关,这是一个常见的误解。这里有一个解释:“通过从GPPD(GET、POST、PUT、DELETE)中去除CRUD(创建、检索、更新、删除)映射,您可以按照REST的原意使用它。使用POST方法来删除、更新或创建资源并没有问题,只要您将其POST到正确的资源即可。”-摘自http://blog.jonnay.net/archives/642-REST-!-CRUD!.html - Wayne Bloss
很遗憾,你的链接对REST的理解存在误解,这影响了它的信息传达。如果你想要删除资源,你不应该指定ID,而是应该指定要删除的资源的URI。 - aehlke
39
CRUD直接映射到REST,这在现实世界中有实际的实现,如CouchDB。说REST就是CRUD并不是误解,因为REST基本上就是Web上的CRUD。REST远不止于CRUD的事实是不相关的。这就像说宇航员不是人类一样,因为他是宇航员而已。 - Wayne Bloss
5
@wizlb,我很困惑,这到底是误解还是不是误解? - Saeb Amini
4
如果你正确地实现了REST,所有的东西都会“看起来”像CRUD,因为你本质上是对状态进行CRUD操作。 - thomas-peter

6

有三种不同的服务风格:

  • RPC API - 客户端发送一个过程和参数给服务,服务负责执行命令并返回结果。
  • Message API(文档API) - 客户端发送DOM(元素),通常比RPC API调用更复杂,因为它们 tend to do not imply operations directly。
  • Resource API - 用于访问资源(数据库元组,文件,图像等)。一般来说,它还应该提供良好的媒体类型协商。

SOAP和REST是W3C标准的编译,主要区别在于SOAP使用HTTP,SMTP等作为传输协议,而REST将其作为应用程序协议,也就是应该支持(GET,PUT,PUSH,DELETE和POST)。SOAP还意味着使用XML,而REST可以使用任何数据类型(JSON,XML,HTTP等)。此外,SOAP的主要优点之一是服务描述符(WSDL文件),它使客户端可以自动生成服务连接器(代理)。

没有万能的解决方案;Web服务的类型和架构取决于实际客户端和技术需求。

想了解该主题的一般概念,请参阅Martin Fowler签名书之一 - 服务设计模式


您可以使用WSDL 2.0或WADL来记录REST服务 http://rest.elkstein.org/2008/02/documenting-rest-services-wsdl-and-wadl.html - icc97

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