从PHP5开始内置soap扩展模块,通过它,我们可以方便的向Service发送一个soap消息,从而触发Service端执行相应的操作,并将结果返回;
首先,要确保安装了SOAP扩展,没有安装的表现是,当运行使用了soapclient的代码时候会有php error Class ‘SoapClient’ not found的错误;
这时候应该安装php-soap,在centos上可以方便的使用yum更新安装包
>yum install php-soap
更新过这些安装包后,需要重新启动一下apache服务,此后SoapClient类就可以用在php script中了
下边是使用过程中的一个范例:
<?php
$client = new SoapClient("some.wsdl");
$client->SomeFunction($a, $b, $c);
$arr= $client->__soapCall("SomeFunction", array($a, $b, $c));
print_r($arr);
?>
1.in WSDL mode,soapCall应用web service,例子用的是asp.net的web service,提供service.asmx页面,调用及查看都比较简单,手册上的example也大多是这个类型,比较简单
SOAP发送的协议:
POST /servicepath/service.asmx HTTP/1.1
Host: 211.186.1.4
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://211.186.5.15/Service/ServiceMethod"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ServiceMethod xmlns="http://211.186.5.15/Service">
<param1>string</param1>
<param2>string</param2>
<param3>string</param3>
</ServiceMethod>
</soap:Body>
</soap:Envelope>
调用方法:
$client = new SoapClient("http://www.xxx.com/service/service.asmx?WSDL");
//向SOAP服务方发送参数值
$param1 = "p1";
$param2 = "p2";
$param3 = "p3";
//serviceParam1,serviceParam2,serviceParam3为发送参数值所对应的参数名(或service端提供的字段名)
$param = array('serviceParam1' => $param1,'serviceParam2' => $param2,'serviceParam3' => $param3);
//方法名为ServiceMethod,参数数组为$param,默认以parameters字段标示传递的参数数组
$arr = $client->__soapCall('ServiceMethod',array('parameters' => $param));
print_r($arr);
此处,print_r($arr)打印出来的是一个对象,类似于
stdClass Object
(
[BindValidateResult] => 01062947546
)
经过我多次的尝试,发现使用$arr[1],$arr[0],$arr[BindValidateResult]均不能取得有效值;后来查询到通过$arr->BindValidateResult可以访问到返回值;