道者编程


php 调用webservice

一:首先安装soap扩展,其实用curl也可以,本质就是POST xml,不过此扩展是用C写的,封装了很多东西,性能也更好,使用更方便友好。

二:连接调用:

这里有个腾讯的webservice,点击

webservice地址:http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl

请求参数:

 

1:通过方法名称直接调用:

try {
	$client = new \SoapClient('http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl');

	$result = $client->qqCheckOnline([ //调用方法,数组方式传参
		'qqCode' => 1000000
	]);
} catch (\Exception $e) {
	$e->getMessage()
}

$result = get_object_vars($result); //返回数组

 2:通过__soapCall调用:

try {
	$client = new \SoapClient('http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl');

	$result = $client->__soapCall('qqCheckOnline', [ //调用方法,数组方式传参
		['qqCode' => 1000000]
	]);
} catch (\Exception $e) {
	$e->getMessage()
}

3: 区别::

1:方法1 是直接通过方法名调用,方法2 也差不多,不过是个二维数组。

2:方法2 可以给单个接口添加 SOAP Header信息

try {

	$client = new \SoapClient('http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl');
	//添加header
	$auth = array(
        'UserName'=>'USERNAME',
        'Password'=>'PASSWORD',
        'SystemId'=> array('_'=>'DATA','Param'=>'PARAM'),
        );
	$header = new SoapHeader('NAMESPACE','Auth',$auth,false);

	$client->__setSoapHeaders($header); //给所有接口添加

	$result = $client->__soapCall('qqCheckOnline', [ //调用方法,数组方式传参
		['qqCode' => 1000000]
	],null,$header); //单个接口添加,必须用 __soapCall
} catch (\Exception $e) {
	$e->getMessage()
}

 4:还有种比较恶心的情况,垃圾server端必须要有 CDATA 端,那边才能接受数据,不能省略。而我们发送的都是数组,如:

qqCode可以用数组,但红框里面那玩意儿不行,这时候怎么办?可以用xml传输,这种情况必须要用到另外一个东西:

SoapVar
$xml = "<![CDATA[<qqCode>'1000000'</qqCode>]]>"; //把红框里面那玩意儿拼凑进来
$param = new \SoapVar($xml, XSD_ANYXML); //这样
$param = new \SoapVar([new \SoapVar($xml,XSD_ANYXML)],SOAP_ENC_OBJECT); //如果还不行,就这样
$result = $client->__soapCall('qqCheckOnline', ['parameters' => $param]);
 


最新评论:
我要评论:

看不清楚


链接