从合作方获取数据,往往都是合作方提供xml格式的数据,或者rsync,甚至直接SQLServer 数据库,对应地,我写php解析xml,直接读取rsync推送过来的文件,用freetds连接SQLServer像读mysql一样去读取数据。周五编辑把合作方的接口文档发信给我,我一看,地址形如http://server:7000/Feature.asmx?wsdl,给了个方法,我立刻一头雾水,这是一个对我来说是完全陌生的领域,马上google,得知原来是著名的WebService (wsdl),随后又google一下PHP如何调用,得知应使用Soap,new一个SoapClient就可以使用了。
<?
//初始化SoapClient客户端
$client
=
new
SoapClient
(
"
http://server:7000/Feature.asmx?wsdl
"
)
;
$param1
=
"
aaa
"
;
$param2
=
"
bbb
"
;
$param3
=
"
cccc
"
;
//这个WebService提供了一个方法,名为GetFeature其参数调用为三个字符串,所以这样写:
$res
=
$client
->
GetFeature
(
$param1
,
$param2
,
$param3
)
;
print_r
(
$res
)
;
?>
返回的是一个对象,stdClass,我又蒙了,这玩意怎么解析呢?
没办法,再google。遂明白,这是一个奇异的对象。。具体为什么奇异请自行搜索吧。我继续说我的流程。
PHP有个强大的serialize,无论什么都可以序列化成字符串。好,就用它来格式化一下这个对象。返回:
O:8:”stdClass”:1:{s:16:”GetFeatureResult”;O:8:”stdClass”:1:{s:7:”anyType”;s:6:”100001″;}}
嗯,这下有办法了,把$res->GetFeatureResult->anyType输出看看,果然是100001。
好了,俺这下会解析了返回结果了。剩下的工作是向合作方询问调用密码以生成校验码作为参数传过去,这个事儿就等周一上班再说吧。
周一上班了,打电话和合作方联系,费了一点力气,对应上了对方的校验规则。
好,开始调用看看。但是很快对方在MSN上发来反馈:
Event[10:51:17] 方法GetFeature:param1=param2=param3=[end]
呀,我的参数没有传过去。
再google,发现调用.net的服务器端时,客户端的SoapClient这样是传不过去参数的。
需要改成如下,使用__call(方法名,array(’paramters’->参数数组))
直接调用->方法名(参数)的时候,__call会使用参数数组作为第二个参数,而.net需要把它再套一层数组,并使用‘paramters’作为键值
<?
//初始化SoapClient客户端
$client
=
new
SoapClient
(
"
http://server:7000/Feature.asmx?wsdl
"
)
;
$param
[
"
param1
"
]
=
"
aaa
"
;
$param
[
"
param2
"
]
=
"
bbb
"
;
$param
[
"
param3
"
]
=
"
cccc
"
;
//必须这样调用才能获得结果,至于为什么必须这么调用,我也不知道……
$res
=
$client
->
__Call
(
'
GetFeature
'
,
array
(
'
paramters
'
=>
$param
))
;
print_r
(
$res
->
GetFeatureResult
->
anyType
)
;
?>
终于获得了我需要的数据!java写的服务器端用第一种方法调用即可,而.net写的服务器端必须用第二种方法才能把参数正确地传过去。
注:linux下需要编译PHP的时候加上编译参数: –enable-soap。我的PHP版本是5.2.5
windows下只需要去掉extension=php_soap.dll这行前面的分号即可