PHPRPC for JavaScript

PHPRPC for JavaScript
 
PHPRPC 对 JavaScript 的支持是非常早的,最初协议的设计中对数据的编码方式,返回数据的格式以及回调参数这些内容都充分考虑了 JavaScript 的特性。大部分 PHPRPC 用户最初也是把 PHPRPC 作为一个优秀的 Ajax 方案来使用的。但是 PHPRPC for JavaScript 不同于其它那些专门用于 Ajax 的 RPC 方案(如 DWR、xajax 等),PHPRPC for JavaScript 客户端与服务器是松散耦合的,它不依赖于某种特定语言编写的服务器。并且它还可以同目前许多优秀的 Ajax 框架(如 JQuery、YUI、MooTools 等)一起使用,而不会有任何冲突。并且它还有一个最大的好处,那就是可以让你轻松实现跨域调用。
 
 
PHPRPC for JavaScript 的安装
 

PHPRPC for JavaScript 有 2 个版本的实现,一个是纯 JavaScript 实现的版本(js 版本),另一个是 Flash 与 JavaScript 混合实现的版本(ajs 版本1)。

PHPRPC for JavaScript 两个版本的安装使用方法略有不同,我们下面分别来介绍一下。

js 版本的安装

js 目录下是纯 JavaScript 版本的源代码,其中的 compressed 目录下是压缩后的版本,压缩后的版本有 2 个,直接存放在 compressed 目录下的是不兼容 Windows IE 5.0 的版本(但兼容 Windows IE 5.5 及其以上版本),ie5compat 目录下是兼容 Windows IE 5.0 浏览器的版本。通常情况下,您不需要使用 ie5compat 的版本,这并不是因为 ie5compat 版本更大一些,运行效率更低一些。而是因为现在还在使用 IE 5.0 的用户基本上已经不存在了。另一个更重要的原因是你页面中的 HTML 部分可能根本就无法在 IE 5.0 上正常显示,其它的(除了 PHPRPC 以外的)脚本也无法在 IE 5.0 上面正常运行。因为 IE 5.0 对 HTML 的显示和 JavaScript 的支持实在是相当差劲。

你如果要在你的页面中引用 PHPRPC for JavaScript,只需要把 compressed 下的 phprpc_client.js 复制到你的 Web 目录的脚本目录下,然后在你的页面中像引用其它外部脚本一样引用该脚本文件就可以了,引用的代码看上去像下面这样:

  1. <script type=“text/javascript” src=“scripts/phprpc_client.js”></script> 

上面这句,你可以放在 head 中,也可以放在 body 中,只要放在你创建 PHPRPC_Client 对象之前就可以了。

ajs 版本的安装

ajs 目录下是 JavaScript 和 Flash 混合实现版本的源代码。同样,你只需要关心 compressed 下的文件(如果你不打算修改源代码的话)。你需要做的同样是将 phprpc_client.js 复制到你的 Web 目录的脚本目录下,同时把 phprpc_flash.js 也复制过去,而 flashrequest.swf 文件你可以放到 Web 目录下的任何你觉得合适的目录下。然后你需要将 phprpc_flash.js 中的 flashrequest.swf 路径修改为你实际的 Web 路径,修改后的代码可能会像这样:

  1. document.write([‘<object classid=”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″ ‘,  
  2.                 ‘type=”application/x-shockwave-flash” ‘,  
  3.                 ‘codebase=”http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0″ ‘,  
  4.                 ‘width=”0″ height=”0″ id=”flashrequest_as3″>’,  
  5.                 ‘<param name=”movie” value=”/scripts/flashrequest.swf” />’,  
  6.                 ‘<param name=”allowScriptAccess” value=”always” />’,  
  7.                 ‘<param name=”quality” value=”high” />’,  
  8.                 ‘<embed src=”/scripts/flashrequest.swf” type=”application/x-shockwave-flash” ‘,  
  9.                 ‘width=”0″ height=”0″ name=”flashrequest_as3″ allowScriptAccess=”always” />’,  
  10.                 ‘</object>’].join()); 

最后,在你的页面中引用这两个脚本,其中 phprpc_client.js 可以放在 head 或者 body 中,而 phproc_flash.js 需要放到 body 中,但不要放到 form 中。这里 ajs 的意思是 Another JavaScript 的意思,你也可以理解为 ActionScript & JavaScript 的意思。

 
 
 
 
PHPRPC for JavaScript 客户端

PHPRPC for JavaScript 的 js 版本和 ajs 版本除了前面安装部分所介绍的引入方法有所不同之外,在用法上基本没有区别。下面我们先来看一下基本用法。

如何调用 PHPRPC 服务

我们先通过一个简单的例子,来介绍如何调用 PHPRPC 服务。

  1. var client = new PHPRPC_Client(‘http://localhost:8080/index.aspx’, [‘add’‘sub’]);  
  2. client.setKeyLength(256);  
  3. client.setEncryptMode(2);  
  4. client.add(1, 2, function (result, args, output, warning) {  
  5.     alert(result);  
  6. });  
  7. client.sub(1, 2, function (result, args, output, warning) {  
  8.     alert(result);  
  9. }); 

PHPRPC_Client 对象的 <span style="color: #008000;">setKeyLength</span> <span style="color: #008000;">setEncryptMode</span> 这两个方法是跟加密传输有关的。

<span style="color: #008000;">setKeyLength</span> 方法用于设置密钥长度

<span style="color: #008000;">setEncryptMode</span> 方法用于设置加密模式

上面设置密钥长度、加密模式都是可选项,如果你不需要这些功能,可以直接忽略它们。

PHPRPC 3.0 for JavaScript 客户端与 Java、.NET 客户端不同,它不需要使用 <span style="color: #008000;">useService</span> 来返回指定接口的远程代理对象,JavaScript 客户端本身就是一个代理对象。所以,上面例子中 <span style="color: #008000;">client.add</span> <span style="color: #008000;">client.sub</span> 这两个调用实际上调用的就是远程方法,对于 JavaScript 客户端来说,远程方法名虽然可以不事先声明,但这样只能在 <span style="color: #008000;">client.onready</span> 事件发生后或者 <span style="color: #008000;">client.getReady()</span> 等于 true 时才能进行调用,但这种做法是为了保持与旧版本兼容而提供的,属于过时的方法,所以不推荐这种做法,而是强烈建议像上面那样直接在客户端代码中指定所需要调用的远程方法名。

回调函数有四个参数,你可以认为它们是服务器端方法执行之后返回的内容。

第一个参数 <span style="color: #008000;">result</span> 是服务器端方法(函数)的返回值,它可以是任意类型。

第二个参数 <span style="color: #008000;">args</span> 是方法调用的参数,如果这个调用是一个引用参数传递的调用,参数也有可能被修改,这时候,你可以通过 args 来获得修改后的参数,关于引用参数传递的调用我们后面会做进一步说明。

第三个参数 <span style="color: #008000;">output</span> 是服务器端输出的内容,它是字符串类型的。

第四个参数 <span style="color: #008000;">warning</span> 是服务器端发生的警告错误(目前只有 PHP 服务器会产生警告错误),一般只调试过程中可能会用到。

通过这个例子,我想你已经可以掌握 PHPRPC for JavaScript 客户端的基本使用方法了。

如何在调用 PHPRPC 服务时,进行引用参数传递?

引用参数传递实际上非常简单,看下面这个例子,首先来看 PHP 的服务器端:

  1. <?php  
  2. include(‘phprpc_server.php’);  
  3. function inc(&$n) {  
  4.     $n++;  
  5. }  
  6. $phprpc_server = new PHPRPC_Server();  
  7. $phprpc_server->add(‘inc’);  
  8. $phprpc_server->start();  
  9. ?> 

这个服务器发布了一个 <span style="color: #008000;">inc</span> 方法,该方法是将参数值加一。这个方法是需要引用参数传递的。下面我们来看看如何在 JavaScript 中调用这个远程过程:

  1. var client = new PHPRPC_Client(‘http://localhost/index.php’, [‘inc’]);  
  2. client.inc(1, function (result, args, output, warning) {  
  3.     alert(args[0]);  
  4. }, true); 

其实很简单,只要在回调函数之后跟一个 true 参数就可以了。这个 true 就是表示启用引用参数传递。

如何来得到远程过程执行的错误信息?

PHPRPC 把错误分为两种,一种是致命错误,一种是警告性错误。

当远程过程执行发生致命错误时,远程过程调用的返回值是一个 PHPRPC_Error 类型的对象,它其中包含了远程过程执行时发生的致命错误信息。

当远程过程执行发生警告性错误时,你可以通过回调函数的第四个参数 warning 得到警告错误, warning 的值也是 PHPRPC_Error 类型的对象。如果没有发生警告错误,warning 为 null

 

Leave a Reply

Your email address will not be published.