php的SOAP-CLIENT详解

2017-01-13 11:33:58来源:CSDN作者:Godfy1990人点击

第七城市
一、概述SOAP有大体两种模式WSDL模式和non-WSDL模式。WSDL模式访问的url中带有?wsdl,SoapClient在实例化的时候需要传入第一个参数。无论是何种模式,方法的参数结构都需要根据服务端的要求填写。最好是服务端提供可正常请求的报文【即请求xml文件】。还有一种比较直接的访问方式是用__doRequest(),直接用自己生成的报文请求,这是用来检验上述两种模式形成的报文是否合格的很好方式。二、WSDL模式
$wsdlUrl = 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl';$params = array('track' => 1);$client = new SoapClient($wsdlUrl, $params = null);$methodParams = array(); // 为请求的参数,根据数据结构填写try {     $resoponse = $client->method($methodParams);     var_dump($response);     file_put_contents('./log.txt', $client->__getLastRequest());} catch (SoapFault $e) {     print($e->getMessage);     file_put_contents('./log.txt', $client->__getLastRequest());}
三、non-WSDL模式
$params = array('location' => 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws',    'uri' => 'http://webservice.companyInterface.dzfp.fp.aisinogd.com',    'trace' => 1);  // location为不带?wsdl的地址,uri为targetNamespace$client = new SoapClient(null, $params = null);$methodParams = array(); // 为请求的参数,根据数据结构填写try {     $resoponse = $client->__soapCall(method, $methodParams);     var_dump($response);     file_put_contents('./log.txt', $client->__getLastRequest());} catch (SoapFault $e) {     print($e->getMessage);     file_put_contents('./log.txt', $client->__getLastRequest());}
四、直接用已有报文请求
$params = array('track' => 1);
$client = new SoapClient(null, $params = null);try {     $response = $client->__doRequest($xmlData, 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws', 'invEli', SOAP_1_2);     var_dump($response);     file_put_contents('./log.txt', $client->__getLastRequest());} catch (SoapFault $e) {     print($e->getMessage);     file_put_contents('./log.txt', $client->__getLastRequest());}
五、SoapVar的使用SoapVar可以用来设置数据类型,数据类型空间,节点名称,节点命名空间
六、示例说明1、首先看一个请求地址:http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl (航天信息科技的测试地址)直接在浏览器访问该地址可以看到如下xml信息:
<wsdl:definitions xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://webservice.companyInterface.dzfp.fp.aisinogd.com" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"targetNamespace="http://webservice.companyInterface.dzfp.fp.aisinogd.com"><wsdl:types><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com"><xsd:complexType name="ElectroniceInfo">...</xsd:complexType><xsd:complexType name="ArrayOfElectroniceDetail">...</xsd:complexType><xsd:complexType name="ElectroniceDetail">...</xsd:complexType><xsd:complexType name="ReturnElectronice">...</xsd:complexType><xsd:complexType name="ElectroniceStock">...</xsd:complexType></xsd:schema><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://webservice.companyInterface.dzfp.fp.aisinogd.com">...</xsd:schema></wsdl:types><wsdl:message name="invEliRequest"><wsdl:part name="parameters" element="tns:invEli"/></wsdl:message><wsdl:message name="queryEliDataRequest"><wsdl:part name="parameters" element="tns:queryEliData"/></wsdl:message><wsdl:message name="queryEliDataResponse"><wsdl:part name="parameters" element="tns:queryEliDataResponse"/></wsdl:message><wsdl:message name="queryEliStockRequest"><wsdl:part name="parameters" element="tns:queryEliStock"/></wsdl:message><wsdl:message name="sendToInvEliResponse"><wsdl:part name="parameters" element="tns:sendToInvEliResponse"/></wsdl:message><wsdl:message name="queryEliStockResponse"><wsdl:part name="parameters" element="tns:queryEliStockResponse"/></wsdl:message><wsdl:message name="sendToInvEliRequest"><wsdl:part name="parameters" element="tns:sendToInvEli"/></wsdl:message><wsdl:message name="invEliResponse"><wsdl:part name="parameters" element="tns:invEliResponse"/></wsdl:message><wsdl:portType name="IEliWebServicePortType"><wsdl:operation name="invEli"><wsdl:input name="invEliRequest" message="tns:invEliRequest"/><wsdl:output name="invEliResponse" message="tns:invEliResponse"/></wsdl:operation><wsdl:operation name="queryEliData"><wsdl:input name="queryEliDataRequest" message="tns:queryEliDataRequest"/><wsdl:output name="queryEliDataResponse" message="tns:queryEliDataResponse"/></wsdl:operation><wsdl:operation name="queryEliStock"><wsdl:input name="queryEliStockRequest" message="tns:queryEliStockRequest"/><wsdl:output name="queryEliStockResponse" message="tns:queryEliStockResponse"/></wsdl:operation><wsdl:operation name="sendToInvEli"><wsdl:input name="sendToInvEliRequest" message="tns:sendToInvEliRequest"/><wsdl:output name="sendToInvEliResponse" message="tns:sendToInvEliResponse"/></wsdl:operation></wsdl:portType><wsdl:binding name="IEliWebServiceHttpBinding" type="tns:IEliWebServicePortType"><wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operation name="invEli"><wsdlsoap:operation soapAction=""/><wsdl:input name="invEliRequest"><wsdlsoap:body use="literal"/></wsdl:input><wsdl:output name="invEliResponse"><wsdlsoap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="queryEliData"><wsdlsoap:operation soapAction=""/><wsdl:input name="queryEliDataRequest"><wsdlsoap:body use="literal"/></wsdl:input><wsdl:output name="queryEliDataResponse"><wsdlsoap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="queryEliStock"><wsdlsoap:operation soapAction=""/><wsdl:input name="queryEliStockRequest"><wsdlsoap:body use="literal"/></wsdl:input><wsdl:output name="queryEliStockResponse"><wsdlsoap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="sendToInvEli"><wsdlsoap:operation soapAction=""/><wsdl:input name="sendToInvEliRequest"><wsdlsoap:body use="literal"/></wsdl:input><wsdl:output name="sendToInvEliResponse"><wsdlsoap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding><wsdl:service name="IEliWebService"><wsdl:port name="IEliWebServiceHttpPort" binding="tns:IEliWebServiceHttpBinding"><wsdlsoap:address location="http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws"/></wsdl:port></wsdl:service></wsdl:definitions>
可以用$client->instance->__getFunctions()); 和$client->instance->__getTypes());方法输出需要请求的方法和携带的参数,但是参数结构是无法通过这里面的信息理清的,最好是能够有一份有效请求的xml。
2、再看一份有效请求的xml文件
<?xml version="1.0" encoding="GB2312"?><soapenv:Envelope xmlns:web="http://webservice.companyInterface.dzfp.fp.aisinogd.com" xmlns:pojo="http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">   <soapenv:Header/>   <soapenv:Body>      <web:invEli>         <web:in0>            <!--Optional:-->            <pojo:BMB_BBH>1.0</pojo:BMB_BBH>            <!--Optional:-->            <pojo:BZ>测试水费发票</pojo:BZ>            <!--Optional:-->            <pojo:CHYY>冲红原因</pojo:CHYY>            <!--Optional:-->            <pojo:CZDM>10</pojo:CZDM>            <!--Optional:-->            <pojo:DDH>SF201600001</pojo:DDH>            <!--Optional:-->            <pojo:DKBZ>1</pojo:DKBZ>            <!--Optional:-->            <pojo:DSPTBM></pojo:DSPTBM>            <!--Optional:-->            <pojo:EMAIL></pojo:EMAIL>            <!--Optional:-->            <pojo:EWM></pojo:EWM>            <!--Optional:-->            <pojo:FHR></pojo:FHR>            <!--Optional:-->            <pojo:FPQQLSH>751300550901125</pojo:FPQQLSH>            <!--Optional:-->            <pojo:FPZT></pojo:FPZT>            <!--Optional:-->            <pojo:FP_DM></pojo:FP_DM>            <!--Optional:-->            <pojo:FP_HM></pojo:FP_HM>            <!--Optional:-->            <pojo:FP_MW></pojo:FP_MW>            <!--Optional:-->            <pojo:GHFQYLX></pojo:GHFQYLX>            <!--Optional:-->            <pojo:GHF_DZ></pojo:GHF_DZ>            <!--Optional:-->            <pojo:GHF_EMAIL></pojo:GHF_EMAIL>            <!--Optional:-->            <pojo:GHF_GDDH></pojo:GHF_GDDH>            <!--Optional:-->            <pojo:GHF_MC>凤凰新城项目部粤VSX018</pojo:GHF_MC>            <!--Optional:-->            <pojo:GHF_NSRSBH></pojo:GHF_NSRSBH>            <!--Optional:-->            <pojo:GHF_SF></pojo:GHF_SF>            <!--Optional:-->            <pojo:GHF_SJ></pojo:GHF_SJ>            <!--Optional:-->            <pojo:GHF_YHZH></pojo:GHF_YHZH>            <!--Optional:-->            <pojo:HJBHSJE>0</pojo:HJBHSJE>            <!--Optional:-->            <pojo:HJSE>0</pojo:HJSE>            <!--Optional:-->            <pojo:HY_DM></pojo:HY_DM>            <!--Optional:-->            <pojo:HY_MC></pojo:HY_MC>            <!--Optional:-->            <pojo:JQBH></pojo:JQBH>            <!--Optional:-->            <pojo:JYM></pojo:JYM>            <!--Optional:-->            <pojo:KPHJJE>127.36</pojo:KPHJJE>            <!--Optional:-->            <pojo:KPLX>1</pojo:KPLX>            <!--Optional:-->            <pojo:KPR>t</pojo:KPR>            <!--Optional:-->            <pojo:KPRQ></pojo:KPRQ>            <!--Optional:-->            <pojo:KPXM></pojo:KPXM>            <!--Optional:-->            <pojo:KP_NSRMC>新兴县供水工程管理处</pojo:KP_NSRMC>            <!--Optional:-->            <pojo:KP_NSRSBH>440001999999218</pojo:KP_NSRSBH>            <!--Optional:-->            <pojo:NSRDZDAH></pojo:NSRDZDAH>            <!--Optional:-->            <pojo:PYDM></pojo:PYDM>            <!--Optional:-->            <pojo:SJ></pojo:SJ>            <!--Optional:-->            <pojo:SKR></pojo:SKR>            <!--Optional:-->            <pojo:SWJG_DM></pojo:SWJG_DM>            <!--Optional:-->            <pojo:TSCHBZ>0</pojo:TSCHBZ>            <!--Optional:-->            <pojo:TSFS></pojo:TSFS>            <!--Optional:-->            <pojo:XHF_DH>020-22397388</pojo:XHF_DH>            <!--Optional:-->            <pojo:XHF_DZ>广州市珠江东路32号规划设计楼层39层全层(自编楼层41层全层)</pojo:XHF_DZ>            <!--Optional:-->            <pojo:XHF_MC>0022</pojo:XHF_MC>            <!--Optional:-->            <pojo:XHF_NSRSBH>440001999999218</pojo:XHF_NSRSBH>            <!--Optional:-->            <pojo:XHF_YHZH>721158340233</pojo:XHF_YHZH>            <!--Optional:-->            <pojo:YFP_DM></pojo:YFP_DM>            <!--Optional:-->            <pojo:YFP_HM></pojo:YFP_HM>            <!--Optional:-->            <pojo:appId></pojo:appId>            <!--Optional:-->            <pojo:authorizationCode></pojo:authorizationCode>            <!--Optional:-->            <pojo:codeType></pojo:codeType>            <!--Optional:-->            <pojo:content></pojo:content>            <!--Optional:-->            <pojo:dataExchangeId></pojo:dataExchangeId>            <!--Optional:-->            <pojo:details>

            <pojo:ElectroniceDetail><pojo:DW>66666</pojo:DW><pojo:GGXH>3333</pojo:GGXH><pojo:HSBZ>3333</pojo:HSBZ><pojo:LSLBS>3333</pojo:LSLBS><pojo:SE>0</pojo:SE><pojo:SL>0.17</pojo:SL><pojo:SPBM>10701010102</pojo:SPBM><pojo:XMBM>123321</pojo:XMBM><pojo:XMDJ>5.85</pojo:XMDJ><pojo:XMJE>126.36</pojo:XMJE><pojo:XMMC>3333</pojo:XMMC><pojo:XMSL>21.6</pojo:XMSL><pojo:YHZCBS>3333</pojo:YHZCBS><pojo:ZXBM>3333</pojo:ZXBM><pojo:ZZSTSGL>3333</pojo:ZZSTSGL><pojo:pcguid>3333</pojo:pcguid></pojo:ElectroniceDetail><pojo:ElectroniceDetail><pojo:DW>3333</pojo:DW><pojo:GGXH>3333</pojo:GGXH><pojo:HSBZ>3333</pojo:HSBZ><pojo:LSLBS>3333</pojo:LSLBS><pojo:SE>0</pojo:SE><pojo:SL>0.17</pojo:SL><pojo:SPBM>10701010102</pojo:SPBM><pojo:XMBM>123321</pojo:XMBM><pojo:XMDJ>1</pojo:XMDJ><pojo:XMJE>1</pojo:XMJE><pojo:XMMC>3333</pojo:XMMC><pojo:XMSL>1</pojo:XMSL><pojo:YHZCBS>3333</pojo:YHZCBS><pojo:ZXBM>3333</pojo:ZXBM><pojo:ZZSTSGL>3333</pojo:ZZSTSGL><pojo:pcguid>3333</pojo:pcguid></pojo:ElectroniceDetail></pojo:details>            <!--Optional:-->            <pojo:encryptCode/>            <!--Optional:-->            <pojo:interfaceCode/>            <!--Optional:-->            <pojo:passWord/>            <!--Optional:-->            <pojo:requestCode/>            <!--Optional:-->            <pojo:responseCode/>            <!--Optional:-->            <pojo:terminalCode/>            <!--Optional:-->            <pojo:userName/>            <!--Optional:-->            <pojo:version/>         </web:in0>      </web:invEli>   </soapenv:Body></soapenv:Envelope>


根据以上信息可以确定invEli的数据结构(需要ElectroniceInfo),我们以数组的形式展示如下:
$methodParams = array('in0'=>array(        'userName'=>'14410101',        'passWord'=>'JWVFkqs7IP+++xBb1I9a/qr6/L/qYxyw==',        'FPQQLSH'=>'435351536253',        'DDH'=>'900122',        'KP_NSRSBH'=>'9144060073757157XN',        'KP_NSRMC'=>'即开即传企业',        'DKBZ'=>'1',        'XHF_NSRSBH'=>'9144060073757157XN',        'XHF_MC'=>'即开即传企业',        'XHF_DZ'=>'测试销方地址',        'XHF_DH'=>'02083191299',        'XHF_YHZH'=>'21321321321',        'GHF_MC'=>'测试购方企业',        'KPR'=>'开票员',        'KPLX'=>'2',        'CZDM'=>'20',        'YFP_DM'=>'044001507111',        'YFP_HM'=>'14514790',        'KPHJJE'=>-100.00,        'BZ'=>'备注',        'details'=>array(array(                'XMMC'=>'测试商品',                'DW'=>'个',                'GGXH'=>'xxl',                'XMBM'=>'123321',                'XMSL'=>10.00,                'XMDJ'=>10.00,                'HSBZ'=>'1',                'XMJE'=>100.00,                'SL'=>'0.17',                'SE'=>14.53        ))        ));

3、利用WSDL模式写一个简单的请求
$wsdlUrl = 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl';$params = array('track' => 1);$client = new SoapClient($wsdlUrl, $params = null);try {     $resoponse = $client->invEli($methodParams);     var_dump($response);     file_put_contents('./log.txt', $client->__getLastRequest());} catch (SoapFault $e) {     print($e->getMessage);     file_put_contents('./log.txt', $client->__getLastRequest());}
4、使用non-WSDL模式请求
$params = array('location' => 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws',    'uri' => 'http://webservice.companyInterface.dzfp.fp.aisinogd.com',    'trace' => 1);  // location为不带?wsdl的地址,uri为targetNamespace$client = new SoapClient(null, $params = null);$methodParams = array(); // 为请求的参数,根据数据结构填写try {     $resoponse = $client->__soapCall(method, $methodParams);     var_dump($response);     file_put_contents('./log.txt', $client->__getLastRequest());} catch (SoapFault $e) {     print($e->getMessage);     file_put_contents('./log.txt', $client->__getLastRequest());}数组中每一个参数可以用SoapVar设置类型和命名空间和节点如使用$this->FPQQLSH = new SoapVar($params['FPQQLSH'], XSD_STRING, 'string', null, null, 'http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com'); //可将FPQQLSH设置成包含'http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com'作为前缀的节点。
第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台