我正在为PHP应用程序实现Web服务,并试图了解标准Web服务和RESTful Web服务所提供的内容.我的目的是编写包装器代码来抽象出Web服务的详细信息,以便开发人员可以"实例化远程对象"并使用它们.以下是我的想法,或许你们中的一些人可以添加你的经验并扩展这个:
RESTful Web服务
基本上只是"按需提供XML源",因此您可以为客户端应用程序编写包装器代码,以便它可以通过以下方式查询服务器应用程序:
$users = Users::getUsers("state = 'CO'");
这将反过来从远程URL获取XML提要
$ users可以被制作成完整User用户对象的集合,或者
保留为XML,或
变成阵列等
查询脚本("state ='CO'")将在服务器端转换为SQL
RESTful Web服务通常只能从客户端的视图中读取,尽管您可以编写可以使用POST或GET在服务器上进行更改的代码,例如传递加密令牌以确保安全性,例如:
$ users = Users :: addUser($ encryptedTrustToken,'jim',$ encryptedPassword,'James','Taylor');
这将在服务器应用程序上创建一个新用户.
标准Web服务
标准Web服务最终基本上做同样的事情.他们的一个优势是客户可以通过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实现可以做得更多.
将享受听取您的反馈意见,以清理其中的一些云.
它们是不同的模型...... REST是以数据为中心的,其中SOAP是以运营为中心的.即使用SOAP,您往往会有离散操作"SubmitOrder"等; 但是使用REST,您通常会更加关注如何查询数据.
SOAP往往与更复杂的关联(有时是必要的) - REST回到POX等,以及YAGNI.
就.NET而言,像"wsdl.exe"这样的工具将为您提供一个完整的客户端代理库来表示SOAP服务(或者用于WCF服务的"svcutil.exe"):
var someResult = proxy.SubmitOrder(...);
对于REST with .NET,我想ADO.NET数据服务是最明显的玩家.在这里,工具(datasvcutil.exe)将为您提供具有LINQ支持的完整客户端数据上下文.LINQ是.NET相对较新的形成复杂查询的方式.所以像(强/静态类型检查和intellisense):
var qry = from user in ctx.Users where user.State == 'CO' select user;
(这将转换为ADO.NET数据服务的相应REST语法/从中转换)