RESTful 和 SOAP Web 服务在实践中有何不同?

Posted

技术标签:

【中文标题】RESTful 和 SOAP Web 服务在实践中有何不同?【英文标题】:How do RESTful and SOAP Web Services differ in practice? 【发布时间】:2008-11-17 16:42:14 【问题描述】:

我正在为 php 应用程序实现 Web 服务,并试图了解标准 Web 服务和 RESTful Web 服务必须提供什么。 我的意图是编写包装代码以抽象出 Web 服务细节,以便开发人员可以“实例化远程对象”并使用它们。 以下是我的想法,也许你们中的一些人可以添加您的经验并扩展它:

RESTful Web 服务

基本上只是“按需提供的 XML”,例如您可以为客户端应用程序编写包装器代码,以便它可以以这种方式查询服务器应用程序:

$users = Users::getUsers("state = 'CO'");
这又会从远程 URL 获取 XML 提要 $users 可以被制作成一个完整的用户对象的集合,或者 保留为 XML,或 变成数组等 查询脚本(“state = 'CO'”)将在服务器端转换为 SQL

从客户端的角度来看,RESTful Web 服务通常是只读的,尽管您可以编写可以使用 POST 或 GET 在服务器上进行更改的代码,例如传递加密令牌以确保安全,例如:

$users = Users::addUser($encryptedTrustToken, 'jim',$encryptedPassword, 'James', 'Taylor');

这将在服务器应用程序上创建一个新用户。

标准网络服务

标准的 Web Servcies 基本上做同样的事情。他们拥有的一个优势是客户可以通过 WSDL 发现他们的详细信息。但除此之外,如果我想编写允许开发人员远程实例化、编辑和保存对象的包装器代码,我仍然需要实现包装器代码。 SOAP 不会为我做任何事情,它可以做到这一点:

$soap = new nusoap_client('http://localhost/test/webservice_user.php?wsdl', true);
$user = $soap->getProxy(); 
$lastName = $user->lastName();

但如果我想编辑和保存:

$user->setLastName('Jones');
$user->save();

然后我需要例如处理服务器端的所有状态,SOAP 似乎并没有在服务器端为每个客户端保存该对象。

也许我正在使用的 PHP SOAP 实现存在一些限制(nusoap)。也许 Java 和 .NET 的实现做得更多。

很高兴听到您的反馈以清除其中的一些问题。

【问题讨论】:

我不明白这个问题。你不能做什么?你有什么问题? 【参考方案1】:

它们是不同的模型... REST 以数据为中心,而 SOAP 以以操作为中心。即使用 SOAP,您往往会有离散操作“SubmitOrder”等;但是使用 REST,您通常可以更加灵活地查询数据。

SOAP 也往往与更多复杂性相关联(这有时是必要的) - REST 又回到了 POX 等,YAGNI。


在 .NET 方面,“wsdl.exe”等工具将为您提供完整的客户端代理库来表示 SOAP 服务(或“svcutil.exe”用于 WCF 服务):

var someResult = proxy.SubmitOrder(...);

对于 .NET 的 REST,我猜 ADO.NET 数据服务是最明显的参与者。在这里,工具 (datasvcutil.exe) 将为您提供具有 LINQ 支持的完整客户端数据上下文。 LINQ 是 .NET 形成复杂查询的相对较新的方法。所以类似于(使用强/静态类型检查和智能感知):

var qry = from user in ctx.Users
          where user.State == 'CO'
          select user;

(这将转换为/从 ADO.NET 数据服务的适当 REST 语法转换)

【讨论】:

【参考方案2】:

我在附和 Marc Gravell 提到的内容。当人们问我关于 REST 的问题时(他们通常对 SOAP 和 SOA 有所了解),我会告诉他们 REST = ROA,因为它是面向资源/数据的,它是一种不同的范式,因此具有不同的设计问题。

对于您的情况,如果我没看错的话,您希望避免编写包装器代码并需要一种可以远程存储对象及其属性的解决方案(并让开发人员完全隐藏它们)。我真的无法提出更好的解决方案。嗯,如果其中任何一个接近满足您的要求,请告诉我:

    EJB3 / JPA CouchDB (REST/JSON)

如果我对您的问题的解释有误,也请告诉我。

如果我们比较 XML-RPC 和 SOAP,后者将为您提供更好的数据类型处理,因为前者虽然您将处理更简单的数据类型,但您必须编写一个层或适配器来将它们转换为您的域对象。

yc

【讨论】:

【参考方案3】:

Soap 只是一组经过标准组织认可的 XML 模式。它的优势在于它专为互操作性而设计,并且支持许多企业级功能。任何平台上的肥皂都不会提供您正在寻找的操作。您需要设计和实施服务合同才能获得这些功能。

听起来您想要 Soap 或 REST 都不特别适合的远程对象。也许你最好看看XML-RPC。

【讨论】:

【参考方案4】:

主要区别基本上是工具。

许多高端 SOAP 堆栈涵盖了从开发人员到您几乎只使用 DTO/文档和 RPC 的大量 SOAP 基础架构。

REST over HTTP 将更多的负担交给了开发人员(协商格式 [XML、JSON、HTTP POST]、解析结果 [DOM、地图、DTO 编组等])。

显然,您可以编写一层逻辑来更轻松地处理此细节。一些 REST 框架的出现使这更容易,但目前,当您希望使用或使用此类服务​​时,它仍然是您的 TODO 列表中的一项任务。

【讨论】:

【参考方案5】:

我的反馈是,如果您想要远程状态,那么您不是在谈论 Web 服务。我不知道任何处理远程状态的当代模型。我认为,如果您需要远程状态,则只能靠自己(没有宗教信仰)。只需将 xml 从这里扔到那里,不要介意理论。

我必须补充一点,远程状态是邪恶的。尽量避免。

【讨论】:

以上是关于RESTful 和 SOAP Web 服务在实践中有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中同时公开 SOAP Web 服务和 RESTful API?

如何使用 JMeter 调用你的 Restful Web Service?进行简单的压力测试和自动化测试

快速入门系列--WCF--03RESTFUL服务与示例

创建 Restful Web 服务以在 C# 中调用存储过程

RESTful

一句话读懂RESTful