php的SOAP-CLIENT详解

来源:互联网 发布:手机按键映射软件 编辑:程序博客网 时间:2024/06/06 02:23
一、概述
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'作为前缀的节点。
0 0
原创粉丝点击