PHPRPC 与 JSON-RPC、XML-RPC 的比较

先列个表:
特性 PHPRPC JSON-RPC XML-RPC
序列化方式 PHP JSON XML
序列化正负无穷大 支持 不支持 不支持
非零基数组传递 支持 不支持 不支持
非连续下标数组传递 支持 不支持 不支持
关联下标数组传递 支持 不支持 不支持
递归结构数组传递 支持 不支持 不支持
递归结构对象传递 支持 不支持 不支持
对象所属类传递 支持 不支持 不支持
可变类型参数传递 支持 支持 不支持
变长参数传递 支持 支持 不支持
引用参数传递 支持 不支持 不支持
服务器端输出重定向 支持 不支持 不支持
服务器端错误重定向 支持 不支持 不支持
浏览器跨域调用支持 支持 不支持 不支持
网络负载
加密传输 内置
易用性 一般
然后,再慢慢道来:

序列化方式

首先我们来看看序列化方式,PHPRPC 采用的是 PHP 方式,JSON-RPC 用的是 JSON 方式,XML-RPC 是用的 XML 方式。这三种序列化方式中 PHP 序列化方式的功能最强大,而且序列化出来的结果在保持纯文本的状态下,还能保证最小负载。 PHP 序列化方式和 JSON 的比较在 JSON-RPC vs PHPRPC —— 序列化数据一文中已经作了比较详细的阐述,而 XML-RPC 的 XML 序列化格式所能表示的内容跟 JSON 相当,他们都无法序列化正负无穷大、非零基数组、非连续下标数组、关联下标数组、递归结构数组、递归结构对象等数据类型,而且序列化的对象相当于一个关联下标数组(或者说是结构体),因为它没有类名。 XML 序列化方式还有个问题,就是它序列化后的数据将变得很大,因此它会加重网络负载。

参数传递

PHP、JavaScript 等许多脚本语言都是弱类型语言,在这些语言当中,一个函数的参数可以是任意类型,而返回的结果也可以是任意类型的。许多语言还提供变长参数支持,即同一个函数的参数个数是不固定的,参数个数可以是任意多个。而且大多数高级语言都支持引用参数传递。这些特征给开发者提供了很大的灵活性。 而 JSON-RPC 不支持引用参数传递,XML-RPC 更差,这三种参数传递的特性都不支持。这些限制使的原本具有灵活性的语言只能提供不具有灵活性的远程调用。但 PHPRPC 对于这三种参数传递的特性都支持,可以给开发者提供最大的灵活性。

重定向

对于本地过程调用,输出和返回结果显然是不同的,PHPRPC 提供了服务器端输出重定向到客户端的功能,它会将服务器端的输出以区别于远程过程调用结果的另一种方式单独返回。并且它还可以将出错信息和错误代码也以另一种方式单独返回给客户端。这就大大的方便了调试和应用。而 XML-RPC 和 JSON-RPC 都不能提供这种支持。

跨域调用和浏览器支持

对于 ajax 编程,最令人头疼的一件事,就是无法跨域调用,这是由 XmlHttpRequest 的安全模型所限制的。JSON-RPC 和 XML-RPC 都是完全使用的 XmlHttpRequest 对象来完成浏览器到服务器通讯的,因此,它们都无法做到跨域调用。 而 PHPRPC 则不完全是使用 XmlHttpRequest 对象与服务器通讯,只有当服务器处于本地域,并且浏览器也支持 XmlHttpRequest(或 XmlHttp)对象时,PHPRPC 客户端才会使用 XmlHttpRequest 对象与服务器通讯,而当服务器处于非本地域或者浏览器不支持 XmlHttpRequest(和 XmlHttp)对象时,PHPRPC 客户端会采用另一种方式——脚本附加技术(或者叫做脚本替换技术)来实现浏览器与服务器的通讯,但是这一切都是由 PHPRPC 客户端对象自动完成的,你无须在为此操心。这正是采用了这种技术,PHPRPC 所能支持的浏览器比 JSON-RPC 和 XML-RPC 更广泛,PHPRPC 不但可以支持 PC、Mac 等机器上的浏览器,而且支持手持设备上(PPC 或者 SmartPhone)的 IE、Opera Mobile、Opera Mini 等浏览器,而这些都是 JSON-RPC 和 XML-RPC 所无法做到的。

加密传输

对于 ajax 编程,还有一件令人头疼的事情就是数据传输的安全性,因为这时候客户端与服务器端的通讯已经是纯数据通讯了,这些信息很容易就会被别有用心的人截获,因此关键的数据在这种情况下传输就比较危险了。通常唯一能够采取的措施恐怕就是要部署 https 服务器,但是一般没有自己服务器的用户就做不到了。而且有时在整个系统中只有少数的数据是需要保密的(例如用户名、密码),而其他信息的传输,也许并不是那么的敏感,而部署 https 服务器的话,所有的内容也就全部加密了。最后还有个问题,http 和 https 会认为是不同的域(即使是相同的域名),因此,你无法从一个 http 页面上用 XmlHttpRequest 去请求一个 https 上的数据。 而 PHPRPC 却已经内置了加密传输的机制,支持不加密传输、单向加密传输和双向加密传输这 3 中数据传输方式。因此,它使得在 http 上安全传输数据成为了现实,而 JSON-RPC 和 XML-RPC 却完全没有这方面的支持。

易用性

上面说了 PHPRPC 具有那么多 JSON-RPC 和 XML-RPC 的特性,你也许会觉得 PHPRPC 也许很庞大很难用吧。而事实上,PHPRPC 在易用性方面做的比 JSON-RPC 和 XML-RPC 都好。举个很简单的例子。比如服务器端,要创建一个远程调用,如果是 JSON-RPC,你需要单独的以不同于编写本地函数的方式来编写远程调用函数,而 XML-RPC 不但要单独的以不同于编写本地函数的方式来编写远程调用函数,而且还需要为远程调用函数来指定各个参数的类型和返回值的地类型等而外的工作。而 PHPRPC 则完全不需要做这些,编写一个 PHPRPC 的远程调用和编写一个本地调用没有任何区别(唯一的区别就是参数和返回结果不能是资源类型,因为资源类型无法序列化,但这一点不是问题,因为 JSON-RPC 和 XML-RPC 也做不到),你甚至可以直接把一个 PHP 中的函数(比如 md5())作为远程过程提供给客户端,你需要做的唯一一件事情,就是告诉服务器,你希望客户端能够调用哪些函数。这只是一个例子,在其他方面 PHPRPC 的易用性也远远好于 JSON-RPC 和 XML-RPC,如果你不敢相信的话,读一读 PHPRPC 用户指南 就知道我没有骗你了。 从上面的比较,不用我说,你也应该发现 PHPRPC 远远好于 JSON-RPC 和 XML-RPC 这个事实了吧。不过最后,我再说点 PHPRPC 的不足吧。目前,PHPRPC 唯一的不足,就是它现在只有 PHP 和 ASP 服务器的版本,其他语言(例如 .NET、Java 等)的服务器版本都还没有实现,不过相信用不了多久它们就会出现了,因为它们已经在开发中了。

标签: Ajax, PHPRPC

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论 (必须):