前言:因为公司最近有一个项目需要用到soap ,需要客户端进行调用来实现相关功能,故研究了一下由PHP客户端调用服务端的soap 请求,如有错误请前辈指正(不喜勿喷),如对你有所帮助或从中有所收获笔者深表荣幸。
soap 简介:简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。
走进soap:
1、因php自带soap扩展,需要在配置环境中开启此扩展,具体方法在这里不予讲述,请自行请教度娘,开启后查看效果如下:
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() 此方法可以查看服务端定义的方法,输出结果如下:
特意强调下:在笔者开发时,忽略了此方法的重要性,导致在实际调用时频频报错,由此结果可以知道想要调用的方法传入参数的类型皆为对象,细心的朋友可以看到我在调用时特意将要传入参数强转为对象传入,在传入参数时需要根据实际情况传入,否则将会报错。
$array[]=(object)$Parameters;
第二个方法$client->__getTypes(),此方法可以查看服务端的参数情况。输出结果如下:
由截图可知笔者用到的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);