关于soap 的PHP客户端调用

时间:2022-09-29 12:02:52

前言:因为公司最近有一个项目需要用到soap ,需要客户端进行调用来实现相关功能,故研究了一下由PHP客户端调用服务端的soap 请求,如有错误请前辈指正(不喜勿喷),如对你有所帮助或从中有所收获笔者深表荣幸。

soap 简介:简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。

走进soap:

1、因php自带soap扩展,需要在配置环境中开启此扩展,具体方法在这里不予讲述,请自行请教度娘,开启后查看效果如下:

关于soap 的PHP客户端调用

2、笔者开始得学习过程是简单的了解了下soap的相关语法教程,地址:http://www.runoob.com/soap/soap-tutorial.html

3、进入正题,SOAP有大体两种模式WSDL模式和non-WSDL模式。WSDL模式访问的url中带有?wsdl,SoapClient在实例化的时候需要传入第一个参数。笔者是以WSDL模式进行访问的。php 客户端调用笔者进行了两种方式进行调用,一种是xml传递参数的方式,一种是以数组传递参数的方式进行调用。

$Parameters['appkey'] = 'apikey';
$Parameters['secretKey'] = $this->secretKey;
$Parameters['timestamp'] = $this->getMillisecond();
$Parameters['nonceStr'] = $this->getNonceStr();
$Parameters['sign'] = $this->getSign($Parameters);
$array['arg0']=$this->appKey;
$array[]=(object)$Parameters;
$client = new SoapClient("http://test.xxx/api/webService?wsdl");
$u = new SoapHeader('http://impl.webservice.xxx.cn/','findNationList',$array);
try{
$client->__setSoapHeaders($u);
$r=$client->findNationList($array);
var_dump($r);
}catch(SoapFault $e){
echo $client->__getLastRequest();
echo $client->__getLastResponse();
echo $e->getMessage();}

$client = new SoapClient("http://test.xxx/api/webService?wsdl");   SoapClient在实例化的时候需要传入的第一个参数。
SoapClient一共有两参数第一个是请求的服务端地址,第二个是可以传入一个数组,可以包括soap的版本号,端口号等等。

实例化后,介绍下两个笔者在实际开发中用到的两个方法  $client->__getFunctions()  此方法可以查看服务端定义的方法,输出结果如下:

关于soap 的PHP客户端调用

特意强调下:在笔者开发时,忽略了此方法的重要性,导致在实际调用时频频报错,由此结果可以知道想要调用的方法传入参数的类型皆为对象,细心的朋友可以看到我在调用时特意将要传入参数强转为对象传入,在传入参数时需要根据实际情况传入,否则将会报错。

$array[]=(object)$Parameters;

第二个方法$client->__getTypes(),此方法可以查看服务端的参数情况。输出结果如下:

关于soap 的PHP客户端调用

由截图可知笔者用到的findNationList方法必传参数是一个字符串类型 参数名为arg0.

$u = new SoapHeader('http://impl.webservice.api.visahall.cn/','findNationList',$array);  此实例化是实例化soap请求头,第一个参数为soap的命名空间,第二个是请求服务端的方法名,第三个是请求头中的参数。

第二种以xml形式请求  

$Parameters['appkey'] = 'apikey';
$Parameters['secretKey'] = $this->secretKey;
$timestamp=$Parameters['timestamp'] = $this->getMillisecond();
$nonceStr=$Parameters['nonceStr'] = $this->getNonceStr();
$sign=$this->getSign($Parameters);
$xml='<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><authHeader><appkey>'.$this->appKey.'</appkey><secretKey>'.$this->secretKey.'</secretKey><nonceStr>'.$nonceStr.'</nonceStr><timestamp>'.$timestamp.'</timestamp><sign>'.$sign.'</sign></authHeader></soap:Header><soap:Body><ns2:findNationList xmlns:ns2="http://webservice.xxx.cn/"><arg0>'.$this->appKey.'</arg0></ns2:findNationList></soap:Body></soap:Envelope>';
$client = new SoapClient($this->hostUrl);
$result = $client->__doRequest($xml,$this->hostUrl,'',1,0);//发送xml必须使用__doRequestvar_dump($result);