SAE上的SOAP客户端——SaeSoap开发手记

#1 chinakr

前言
=========

Sina App Engine(SAE)到目前为止还不支持SOAP,但是询问的人不少,我也是一个。对于这些提问,新浪管理员都做了认真回复,给出了解决思路,并且希望有用户能够自己去实现。

SAE文档中心关于SOAP的问题:
http://sae.sina.com.cn/?keyword=SOAP&m=search

为了响应伟大的SAE的号召,为了满足项目的小小需要,SaeSoap诞生了!


基本信息
============

应用名称:
PHP SOAP for ASE

访问方式:
http://saesoap.sinaapp.com/

应用说明:
让SAE原生支持PHP SOAP!


开发环境
============

SAE应用管理 -> 应用管理 -> 代码管理:创建版本1

$ sudo aptitude install php-pear

$ cd /path/to/sae/
$ svn checkout https://svn.sinaapp.com/saesoap/
$ cd saesoap/1

拷贝 pear SOAP, HTTP_Request, Net_Socket, Net_URL,注意目录和文件的权限都必须是755。

$ ln -s /path/to/sae/saesoap/1 /var/www/saesoap


测试代码
============

问题和解决方法
-----------------

$ gvim /path/to/sae/saesoap/1/index.php
require 'SOAP/Client.php';
$uri = 'http://www.5haoxue.net/ws/hello-soap.php';
$client = new SOAP_Client($uri);
$result = $client->call('fetch_news', array());
echo $result;
?>
$ lynx http://localhost/saesoap/

出现了“No Transport for http”错误。这个错误提示是在Transport.php中定义的SOAP_Transport类的getTransport方法中输出的。出错的原因是没有复制SOAP/Transport/目录,在这个目录下有HTTP.php。补上以后测试成功!

在SAE上测试
----------------

$ svn status
$ svn add HTTP/ SOAP/ Net/
$ svn commit -m 'Test pear SOAP client'
$ lynx http://saesoap.sinaapp.com/

发现SAE不支持PEAR:

SAE_Warning: require_once(PEAR.php) [function.require-once]: failed to open stream: No such file or directory in SOAP/Base.php on line 30
SAE_Fatal_error: require_once() [function.require]: Failed opening required 'PEAR.php' (include_path='.:/usr/local/sae/php/lib/php/sae_std_lib/') in SOAP/Base.php on line 30

管理员说是出于安全性考虑:
http://sae.sina.com.cn/?m=feedback&a=view&id=3262
建议手动安装PEAR,并给出了教程的链接:
http://hi.baidu.com/mleoking/blog/item/ebe307ca55146d43f21fe792.html

直接拷贝PER文件:
$ sudo updatedb
$ locate PEAR.php
$ cp /usr/share/php/PEAR.php /path/to/sae/saesoap/1
$ svn add PEAR.php
$ svn commit -m 'Add PEAR.php'
$ lynx http://saesoap.sinaapp.com/

出现了一些警告信息,但是数据读出来了!警告信息如下:

SAE_Warning: include_once(PEAR5.php) [function.include-once]: failed to open stream: No such file or directory in PEAR.php on line 730
SAE_Warning: include_once() [function.include]: Failed opening 'PEAR5.php' for inclusion (include_path='.:/usr/local/sae/php/lib/php/sae_std_lib/') in PEAR.php on line 730


继续拷贝PEAR5.php文件:
$ locate PEAR5.php
$ cp /usr/share/php/PEAR5.php /path/to/sae/saesoap/1
$ svn add PEAR5.php
$ svn commit -m 'Add PEAR5.php'

现在没有错误也没有警告了,只剩下一堆SAE_Deprecated和数据了:

SAE_Deprecated: Assigning the return value of new by reference is deprecated in SOAP/WSDL.php on line 214
...
SAE_Deprecated: Function split() is deprecated in SOAP/Transport/HTTP.php on line 272


现在可以把代码迁移到好学网手机版中去了!


小结
=========

SaeSoap目前实现了在SAE上使用SOAP Client,实现的方式是使用了PEAR SOAP,并不需要对代码进行修改。

SAE上的SOAP Server,目前项目还没有需求,因此暂时也没有时间去实现,希望能有朋友能够抽时间来完成!

SaeSoap Demo:
http://saesoap.sinaapp.com/

基于SpeedPHP和SaeSoap实现的手机版网站:
http://m.5haoxue.net/

2011-12-27 10:26:08

#2 chinakr

博客地址:
http://blog.quickbest.net/archives/php/sae-soap-client-saesoap.html

谁实现了SOAP Server for SAE,一定来通知一下噢!

2011-12-27 10:29:23