7

我正在为 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 实现做得更多。

会很高兴听到您的反馈以清除其中的一些乌云。

4

5 回答 5

8

它们是不同的模型... 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 语法转换)

于 2008-11-17T17:01:02.100 回答
2

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

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

  1. EJB3/JPA
  2. CouchDB (REST/JSON)

如果我错误地解释了您的问题,也请告诉我。

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

yc

于 2008-11-18T03:44:48.883 回答
1

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

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

于 2008-11-17T17:19:42.377 回答
0

主要区别基本上是工具。

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

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

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

于 2008-11-17T17:03:01.630 回答
0

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

我必须补充一点,远程状态是邪恶的。如果可以的话,避免它。

于 2008-11-17T17:04:52.763 回答