浏览模式: 标准 | 列表

本教程不打算写成一份面面俱到但枯燥无味的 API 手册,而是要把 PHPRPC 中从最基本的用法到高级的应用技巧,以生动活泼的实例展示给大家。

如果你对 PHPRPC 感兴趣的话,那么我们就开始 PHPRPC 之旅吧!

大部分 ajax 框架都很庞大,不但处理传输,而且更多的工作是负责显示的处理,更有甚者,还要用服务器端程序生成客户端的 JavaScript,或者把客户端 JavaScript 本身改造一番。

PHPRPC 与其它 ajax 框架不同,PHPRPC 遵循的是“只做一件事,并把它做好”的原则。它只负责数据传输,并且将传输做到最好!它将你以前用传统的 ajax 方式做不到或者很难做到的事情变得轻而易举!

相信好多人选择 PHPRPC 的一个主要原因就是它能够让你开发 ajax 应用变得更加容易!尽管 PHPRPC 的强大之处不仅限于此,但我不得不承认,这确实是 PHPRPC 的一大亮点! 

所以,我们的第一站,就来看看如何用 PHPRPC 3.0 来编写 ajax 应用吧。

» 阅读全文

原创作品,转载请注明出处。

PHPRPC 3.0 协议的升级主要在于完善 PHPRPC 协议安全性的设计。增加了对输出捕获的加密支持,另外,增加了密钥交换时密钥长度的选项。

在 2.0 和 2.1 协议中,在远程过程调用阶段的请求中的 phprpc_encrypt 参数用来指定加密模式,该参数在 3.0 协议中增加了 3 这个取值,该取值表示除了 phprpc_args 参数和应答中的 phprpc_result 加密以外,应答中的 phprpc_output 也要经过加密处理。

在 2.0 和 2.1 协议中,没有规定密钥交换的长度,所以密钥交换时密钥长度不同的两个实现是无法正常通讯的。但是目前所有的 2.0 和 2.1 实现中,都是按照 128 位的密钥长度进行编写的,因此它们目前没有遇到这种问题。但为了允许更长的密钥交换,并且可以兼容已有的实现。在 PHPRPC 3.0 协议中,增加了 phprpc_keylen 选项。对于该选项的描述如下:

当客户端发起密钥交换请求时,可以带有 phprpc_keylen 参数,该参数值表示密钥交换的位数。例如:

phprpc_keylen=512

如果服务器支持客户端所指定的位数,则进行密钥交换时,在响应中返回相同的参数,但格式按照响应的格式返回,例如:

phprpc_keylen="512";

如果服务器端不支持客户端所指定的位数,则选择支持的最接近客户端所指定的位数进行密钥交换,并且在响应中给出实际的位数,例如:

phprpc_keylen="160";

如果服务器端使用 128 位来进行密钥交换,则响应中可以不给出密钥交换的位数,客户端也应该按照 128 位来进行处理。

该响应参数与 phprpc_encrypt 响应参数都只在密钥交换第一阶段出现。

注意,以前版本的 PHPRPC 协议,phprpc_encrypt 在密钥交换的第二阶段返回一个序列化的 boolean 值 true,但因为该值从来没有被使用过,故而在 3.0 版本中取消该响应。

另外,在密钥交换阶段,不再返回 phprpc_functions 的响应。这样做的目的是为了进一步减少带宽占用。但可能会与早期的 2.0、2.1 版本的某些 JavaScript 客户端实现在加密传输处理上不兼容,但这种兼容性是与协议实现有关的,与 2.0、2.1 版本协议仍然是兼容的。

由于协议的以上变动,因此在密钥交换的第二阶段仅输出请求中 phprpc_callback 参数的值(如果存在的话)。早期的协议对于响应中各个参数的顺序,是有定义的,这样做是为了方便客户端实现。但建议新的客户端在实现时不要过于依赖相应参数的顺序。但对于新的服务器来说,仍然建议按照早期定义的顺序输出响应参数。另外需要强调,请求中 phprpc_callback 参数的值一定要作为响应中的最后一项输出。

为了使 PHPRPC 的浏览器客户端在禁用 cookie 的情况下仍然能够进行密钥交换和加密传输,建议服务器在密钥交换的第一阶段,如果检测到客户端可能不支持基于 cookie 的会话(例如可以检测建立的是否是一个新的会话)时,在输出密钥交换参数(phprpc_encrypt)和密钥长度(phprpc_keylen)选项后,增加一项输出 phprpc_url,例如:

phprpc_url="http://localhost:8080/test/test.jsp;jsessionid=896CE4204292E70D28D27FE7C4503232";

其中 phprpc_url 的值是在原服务地址上增加了服务器会话标示(session id)的地址。会话标示的附加方式由服务器端根据实际情况来决定,如果原客户端地址本身带有 url 请求参数,应该保留原有参数。例如,如果原服务器地址为 http://localhost:8080/test/test.jsp?serverid=2342&action=do,则响应中的 phprpc_url 应为如下格式:

phprpc_url="http://localhost:8080/test/test.jsp;jsessionid=896CE4204292E70D28D27FE7C4503232?serverid=2342&action=do";

服务器仅应该过滤掉请求地址中以 phprpc_ 开头的请求参数。另外,该值的编码方式与 phprpc_errstr 的编码方式相同,即根据请求中 phprpc_encode 的值来决定进行 base64 编码还是 javascript 字符串格式编码。该响应仅在密钥交换的第一阶段返回。

客户端在收到该响应后,应使用该服务地址替换原来的服务地址。之后所有的调用(包括密钥交换第二阶段)都使用新的地址,从而实现在无 cookie 的情况下,仍然可以使会话一直保持下去,保证密钥交换和加密传输顺利进行。

在 2.0 和 2.1 协议中,没有规定加密算法,但目前的实现所使用的加密算法都是 XXTEA 加密算法。为了保证所有的实现都能够兼容,因此,在 PHPRPC 3.0 中,规定加密应使用 XXTEA 加密算法。

XXTEA 加密算法的密钥长度为 128 位,如果密钥交换采用的是 128 位(默认)密钥,则交换后的密钥直接用于 XXTEA 加密算法。其它长度的密钥需要用 MD5 算法生成 128 位密钥(在对非 128 位密钥进行 MD5 时,是对其 10 进制表示的数字字符串进行 MD5,而非其它形式),然后再用于 XXTEA 加密算法中。

为了避免同一个页面上的多个 JavaScript 客户端在与同一个服务器进行密钥交换时产生冲突,故在请求中增加了一个参数: phprpc_id,该参数的值由客户端生成,用于唯一标示该客户端。服务器端根据该值来区别同一会话中的多个客户端。该参数仅用于 JavaScript 客户端。

服务器端如果对字符集进行解释(例如 Java、.NET 等双字节字符编码的语言实现的服务器),不论对客户端提交的请求,还是对输出的响应,都按照服务器端设置的字符集进行解释。客户端的请求中可以包含字符集设置,但是应该与服务器端设置相同,在与服务器端设置不同的情况下,按照服务器端设置的字符集进行处理。建议统一使用 UTF-8 字符集,在此种情况下,可以保证所有服务器与客户端正常通讯,如设置其它字符集,只能保证两个相同字符集设置的服务器和客户端可以正常通讯。

原创作品,转载请注明出处。

» 阅读全文

Server API:

constructor PHPRPC_Server();

Create the PHPRPC Server object.

Add(String funcname, Object obj);
Add(String funcname, Object obj, String alias);
Add(String[] funcnames, Object obj);
Add(String[] funcnames, Object obj, String[] aliases);
 
Add(String funcname, Type type);
Add(String funcname, Type type, String alias);
Add(String[] funcnames, Type type);
Add(String[] funcnames, Type type, String[] aliases);

Add instance methods or static methods to the server. The methods can have aliases. This method must be called before start().

SetCharset(String charset);
SetCharset(Encoding encoding);

Set the charset of the server. This method must be called before start();

SetDebugMode(Boolean debug);

Set the debug mode of the server. This method must be called before start();

Start();

Start the PHPRPC server. This method usually be called at the end of page. This method can NOT be called twice or more in one page.

Client API:

constructor PHPRPC_Client();
constructor PHPRPC_Client(String serverURL);
constructor PHPRPC_Client.create();
constructor PHPRPC_Client.create(String serverURL);

Create PHPRPC Client object. The serverURL supports using username and password for the HTTP Basic Authorization, but it is NOT recommend. To use create method create PHPRPC Client object in VBScript.

SetProxy(String address);
SetProxy(String host, String port);
SetProxy(String host, String port, String username, String password);

Set the proxy server for the transfer. The address supports using username and password for the HTTP Basic Authorization, but it is NOT recommend. You can set the address to null to cancel the proxy server.

UseService(String serverURL);
UseService(String serverURL, String username, String password);

Set the URL of the PHPRPC Server. The serverURL supports using username and password for the HTTP Basic Authorization, but it is NOT recommend. You’d better to set username and password alone.

boolean SetKeyLength(int keyLength);

Set the key length for the key exchange. This method will return false when the key exchange already to be done.

int GetKeyLength();

Get the key length. This method will return actual value when the key exchange being done. Otherwise, you will get the default length or which length you set.

SetEncryptMode(int encryptMode);

Set the encrypt mode. 0 denotes no encrypting any data. 1 denotes encrypting arguments in the transfer. 2 denotes encrypting arguments and result. 3 denotes encrypting arguments, result and output of the server console.

Invoke(String function, param Object[] args);
Invoke(String function, ref Object[] args, bool byRef);

Invoke the server function with the function name and arguments array. if you want to transfer the arguments by reference, set byRef to be true.

String GetOutput();

Get the output of the server console after invoke the server function.

PHPRPC_Error GetWarning();

Get the warning of the server function after invoke the server function.

IWebProxy Proxy;

You can use this property to set the Proxy directly.

ICredentials Credentials;

You can use this property to set the Authorization directly.

» 阅读全文

经过了近一个月的努力开发与严格测试,PHPRPC_2.1-20060810 版终于发布了!

该版本最重要的更新是增加了 PHPRPC for Java 服务器和客户端。另外,修正了早期版本中的许多小问题,并进行了代码优化,剔出了过时的文件,更改了一些目录结构,去掉了内置的文档(以后会在 http://www.phprpc.org 上提供在线版本的文档)。下面是一些主要的更新说明:

修正了 XXTEA.cs 中当解密数据不对时造成的内存溢出错误(其他语言版本也作了修正)。
修正了 PHPSerializer.cs 中使用双字节编码字符集(例如 UTF16)时不能正确序列化的问题。
增加了对 NAN 序列化和反序列化(JavaScript,C# 和 Java 版本)。
移除了过时的 phprpc_ajax_client 和 phprpc_js_client。
将 php4_rpc_client.php 和 php5_rpc_client.php 合并入 phprpc_client.php。
修正了 PHPRPC for .NET 服务器端输出捕获的错误。
修正了 PHPRPC for .NET 客户端处理输出捕获的错误。
优化了 PHPRPC for .NET 客户端的代码。
修正了 PHPRPC for .NET 客户端代理设置后不能重置的问题。
为 PHPRPC for .NET 客户端增加了 Credentials 属性。
将 PHPRPC for PHP 转移到 php 目录下(移除了原来的 include 目录)。
修正了 PHPRPC for PHP 客户端引用参数处理不当的小问题。
修正了 PHPRPC for PHP 服务器端错误处理的一个小问题。
取消了内置文档。
增加了 LICENSE,README,INSTALL 和 AUTHORS 文件。
增加了 PHPRPC for Java 服务器和客户端。

下载:

» 阅读全文

上个星期发布了 PHPRPC for .NET 的服务器版本,又经过一个星期的努力,PHPRPC for .NET 的客户端版本也完成了。这个客户端版本不仅可以用在 ASP.NET 中,在 .NET 的 WinForm 中同样可以使用。该客户端目前实现的是同步调用,支持设置代理服务器,支持引用参数传递,服务器端输出重定向,加密传输等功能。调用远程方法使用 Invoke 方法,第一个参数为远程过程名,后面的参数为远程过程的参数。如果为引用传递,需要将参数放入一个 object[] 数组,然后用 ref 参数传递。另外,近期内将发布的版本中包含了一个 pag.exe 的工具,你可以使用它方便的生成客户端代理类,然后使用生成的代理类,就可以直接通过远程过程名来调用远程方法了。

» 阅读全文