支持跨域无参数长度限制的 JavaScript PHPRPC 3.0 客户端

以前发布的 PHPRPC 3.0 的 JavaScript 客户端 是通过 script 标签来支持跨域调用的,因此限制了参数的长度不可能太长,并且如果页面不是 UTF-8 编码时,也不能跟服务器进行交互,原因是 script 没办法指定单独的 HTTP 头。前些日子发布的 ActionScript 3.0 版本的 PHPRPC 3.0 客户端是通过 POST 来提交数据的,Flash 的跨域调用机制跟浏览器中的 XMLHTTPRequest 对象的跨域机制不同,Flash 的跨域调用限制可以通过在服务器端部署一个 crossdomain.xml 文件来进行限制。因此 ActionScript 3.0 版本的 PHPRPC 3.0 客户端是可以跨域的,而且服务器端还可以限制跨域的条件。前几天有位朋友建议我给 JavaScript 跨域调用增加无参数长度限制的能力,他给出的方案是对 GET 请求分包传送,不过因为这种方法需要修改 PHPRPC 协议,目前的客户端和服务器端实现也都要作出修改才可以支持,而且就算实现了效率方面也不会很高,因此我突发奇想,如果在 JavaScript 中调用 Flash 的 ActionScript 3.0 的 PHPRPC 3.0 客户端不就既可以支持跨域,又没有参数长度限制了吗?而且因为 ActionScript 3.0 的执行效率比 JavaScript 高,所以,加密传输也会更快!ActionScript 3.0 里面跟服务器端交互是单独指定的 HTTP 头,因此也不会有页面非 UTF-8 编码时不能跟服务器交互数据的问题了。

于是,花了 2 天时间终于搞了一个跟原来 JavaScript PHPRPC 3.0 客户端使用方法相同的通过 ActionScript 3.0 跟 JavaScript 交互来实现的支持跨域无参数长度限制的 JavaScript PHPRPC 3.0 客户端。实现中当然遇到了一些问题,不过我单独写了一篇关于这些问题和解决办法帖子,这里就不罗嗦了。下面说一下这个 JavaScript PHPRPC 3.0 客户端跟原来的那个有什么不同之处:

1、新的这个 JavaScript 客户端需要在 HTML 的 body 插入 phprpc_flash.js 脚本(通过 script 标签来引入该文件),这段脚本不能放在 head 中,也不能放在 form 中。另外,要保证 phprpc_flash.js 中引用的 phprpc_client.swf 文件的路径是正确的。

2、都支持目前常见的浏览器,如:IE,Mozilla/Firefox,Opera,Safari 等。但是在非跨域的情况下,原来的 JavaScript 客户端对手持设备(例如 Pocket PC,SmartPhone,iphone 等)支持的更好,而新的这个 JavaScript 客户端因为需要 Flash9 的支持,在目前的手持设备上都不支持。

3、新的这个 JavaScript 客户端不支持 abort、setTimeout 和 getTimeout 这三个方法。因为在 ActionScript 3.0 版本的 PHPRPC 客户端里面也没有提供这三个方法。不过还好,这三个方法都是不常用。

4、在 JavaScript 中定义的对象,通过这个客户端传给服务器时,可能会变成 Hash 表(比如 PHP 中的 Array,Java 中的 HashMap,.NET 中的 HashTable),因为 JavaScript 跟 ActionScript 3.0 交互时,会在内部进行一次序列化和反序列化(Flash 本身处理的,而不是 PHPRPC 的序列化和反序列化)。

5、JavaScript 中的递归定义的对象,无法通过该客户端跟服务器通信,原因同第 4 条。因为 Flash 内部的这种 JavaScript 跟 ActionScript 3.0 之间的序列化和反序列化不支持递归对象。

今天把整个代码重写了一下,这次只使用 AS3 中的 URLLoader 来实现 POST 数据,而不再直接使用 AS3 版本的 PHPRPC 客户端,并且在非跨域情况下,仍然使用 XMLHttpRequest 来提交数据,因此,原来列举的上面那些不同的问题,除了第一条之外,2、3、4、5 都已经解决,跟原来的纯 JavaScript 版本完全一致了。

下载地址请访问 PHPRPC 官方网站:http://www.phprpc.org

标签: Ajax, JavaScript, PHPRPC, ActionScript/Flash

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论 (必须):