既然说到SOAP就先对这个有个大概了解吧。
SOAP(简单对象访问协议)定义了客户机与服务器之间传递的消息。消息采用 XML 格式。SOAP 独立于平台、编程语言、网络和传输层。
这次做的项目中需要提供WebService服务,没话说,由于是PHP的项目,首先就按照习惯用了NuSOAP,结果让我郁闷了好久,程序返回的是一个数组,但是用print_r()打印出来是空的,用count()看了一下大小为1,郁闷ing。看了一下response数据是存在的啊。又对照了一下以前做的SOAP(是在PHP4上的),两个response有点不同,这才反应过来是PHP5跟PHP4的版本不一样。
打开php.ini,找到扩展模块那部分,把soap的模块加载上,又重新写了一下Server端和Client端,继续测试。总是出现“looks like we got no XML document”的error。难道是用法错了,手头正好有本《PHP5 Power Programming》找到SOAP的地方,没找到问题,又跑到zend的官方网站上看了一下SOAP的介绍和示例(http://www.zend.com/php5/articles/php5-SOAP.php?out=dynamicwebpages),没错啊。去Google搜索这个错误,最后还是连到了zend的一个blog上(http://www.zend.com/php5/articles/php5-SOAP.php?article=php5-SOAP&kind=php5&id=5085&open=1&anc=0&view=1),前半部分跟上面那个是一样的,直接跳过,看下面的Comment,发现好多人都遇到了这个问题,人提到是在PHP开始标签之前存在blank character,可我的没有啊,我的有个require_once("mainfile.php"),把这句注释掉以后就没问题了,又继续根据mainfile.php追踪下去,发现是在类的文件中PHP结束标签之后有blank character,删除掉就没问题了。
在zend上的comments里还有人提到是XML文件的编码问题,这个我没有测试。终于搞定了这个问题,继续写接口,哎……
郁闷本来想把全部代码贴上来,结果排版会有问题,还是贴些重要的吧!
Server端:
1
$web_service
=
new
SoapServer(
null
,
array
(
'
uri
'
=>
'
ispfcn
'
,
'
encoding
'
=>
'
gb2312
'
));
2
$web_service
->
addFunction(
"
iGetUserList
"
);
3
$web_service
->
addFunction(
"
iRegisterUser
"
);
4
$web_service
->
addFunction(
"
iSetUserPwd
"
);
5
$web_service
->
handle();
Client端:
1try {
2$opts = array('location' => 'http://192.168.0.56/web_service.php','uri'=>'ispfcn','encoding'=>'gb2312');
3$client = new SoapClient(null,$opts);
4$custom_id=1;
5$custom_name="system";
6$custom_pwd=md5("system");
7$custom_flag="sys";
8$start=0;
9$limit=0;
10$result = $client->iGetUserList($custom_id,$custom_name,$custom_pwd,$custom_flag,$start,$limit);
11for ($i=0;$i<count($result);$i++){
12 echo sprintf("%4d",$result[$i]['user_id']).":".$result[$i]['username']."";
13 }
14}
15catch (SoapFault $e)
16{
17echo $e->faultcode,' '.$e->faultstring."n";
18}