soapclient,php5自带的。当然,也可以使用nusoap.php这个纯php写的类,该类代码行数为7k多行,效率上肯定不如soapclient。
一、寻找webservice来源
webservice可以自己编写,但是也可以从网络上去寻找现成的。我用的是www.xmethods.net里的us zip validator。它的wsdl文件位置在:http://www.webservicemart.com/uszip.asmx?wsdl。 它的作用是根据输入的zip代码,返回该代码对应的美国地名,州名,经纬度等。
二、创建soapclient
第二步就是创建soapclient,并调用webservice中的方法,并获得返回值。php代码如下
二、创建soapclient
第二步就是创建soapclient,并调用webservice中的方法,并获得返回值。php代码如下:
代码如下 复制代码
$objsoapclient = new soapclient(http://www.webservicemart.com/uszip.asmx?wsdl);
$param=array(zipcode=>$zip);
$out=$objsoapclient->validatezip($param);
$data=$out->validatezipresult;
soapclient的创建有好多方法,我们用的是最标准的(也是最简单的)wsdl方法。由于查询zip的方法肯定需要一个参数,所以我们必须创建一个数组,用“参数名=>取值”的方式进行赋值。
也许读者会对这个数组的创建有一定的兴趣。比如,我们怎么知道“参数名”应该是“zipcode”而不是别的什么呢?为什么没有更多的参数了,而只有一个?ok,这个问题我们稍后解释。因为这牵涉到wsdl的解读。
创建好参数后,同样的,我们调用soapclient的方法validatezip,并传递参数进去;对于返回的结果,我们用$data变量取出我们真正感兴趣的东西。同样的,这里也存在方法名称是如何确定的问题。我们也在稍后介绍。
如果你也使用phped进行php的开发和调试,那么从下面的调试窗口截图中,你可以很清除的看到$data和$out之间的关系:
三、解析数据
上面得到的$data中的数据是标准的xml结构的数据。所以在php中,我们需要创建一个xml解析器来对这个数据进行分析。代码如下:
代码如下 复制代码
$parseddata=array();
function startelement($parser, $name, $attribs)
{
global $parseddata;
echo $name;
if (count($attribs)) {
foreach ($attribs as $k => $v)
{
$parseddata[$k]=$v;
echo $k=$v;
}
}
echo >;
}
function endelement($parser, $name)
{
echo $name>;
}
$xml_parser= xml_parser_create();
xml_parser_set_option($xml_parser, xml_option_case_folding, 1);
xml_set_element_handler($xml_parser, startelement, endelement);
echo
;
if (!xml_parse($xml_parser, $data)) {
die(sprintf(xml error: %s at line %d, xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
echo
;xml_parser_free($xml_parser);
这里的详细操作需要参考php函数手册中关于xml函数的那一章。这里不再赘述。一旦数据被解析成功,我们就可以进行进一步的处理。例如下面的代码就遍历该数组,然后输出:
代码如下 复制代码
foreach ($parseddata as $k=>$v)
{
echo $k.=>.$v.
;
}
四、解读wsdl
上面我们留下了两个疑问:如何知道一个webservice提供的方法,以及它的参数?所有的答案都在wsdl描述中。对于本文使用的wsdl来说,我们 从中截取一段来分析。由于我们是通过soap进行调用,所以我对完整的wsdl进行了节选,只列出关于soap调用的部分(反相显示的部分):
首先我们注意到这一节,它指出了在soap调用中,入口参数要参照validatezip,于是我们接着转到文件上面一点的地方,看validatezip方法的定义:
代码如下 复制代码
很明显,validatezip要求一个参数,名称为zipcode,类型为string。
同样,我们再看这一节,它指出soap调用的出口参数是validatezipresponse。而后者的 传出参数名称是validatezipresult。于是,我们就解释了前两节提出的问题:
•怎样找到要调用的函数?
•怎样知道函数的参数、类型?
•怎样得到函数的返回值?
例2,
这里我们使用php5自带的类来操作
我的结构如下:在 webservice 文件夹下有如下三个文件:personinfo.php,soapclient.php,soapserver.php,具体作用可以参照代码中的注释。
代码如下 复制代码
soapserver.php));
$s->setclass(personinfo);
$s->handle();
[/php]
[php]
’soapserver.php’));
echo $soap->getname();
echo $soap->gettime();
} catch(soapfault $e) {
echo $e->getmessage();
} catch(exception $e) {
echo $e->getmessage();
}