一、概述
SOAP有大體兩種模式WSDL模式和non-WSDL模式。WSDL模式訪問的url中帶有?wsdl,SoapClient在實例化的時候需要傳入第一個參數。
無論是何種模式,方法的參數結構都需要根據服務端的要求填寫。最好是服務端提供可正常請求的報文【即請求xml文件】。
還有一種比較直接的訪問方式是用__doRequest(),直接用自己生成的報文請求,這是用來檢驗上述兩種模式形成的報文是否合格的很好方式。
二、WSDL模式
1 $wsdlUrl = 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl';
2 $params = array('track' => 1);
3 $client = new SoapClient($wsdlUrl, $params = null);
4 $methodParams = array(); // 為請求的參數,根據數據結構填寫
5 try {
6 $resoponse = $client->method($methodParams);
7 var_dump($response);
8 file_put_contents('./log.txt', $client->__getLastRequest());
9 } catch (SoapFault $e) {
10 print($e->getMessage);
11 file_put_contents('./log.txt', $client->__getLastRequest());
12 }
三、non-WSDL模式
1 $params = array('location' => 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws',
2 'uri' => 'http://webservice.companyInterface.dzfp.fp.aisinogd.com',
3 'trace' => 1); // location為不帶?wsdl的地址,uri為targetNamespace
4 $client = new SoapClient(null, $params = null);
5 $methodParams = array(); // 為請求的參數,根據數據結構填寫
6 try {
7 $resoponse = $client->__soapCall(method, $methodParams);
8 var_dump($response);
9 file_put_contents('./log.txt', $client->__getLastRequest());
10 } catch (SoapFault $e) {
11 print($e->getMessage);
12 file_put_contents('./log.txt', $client->__getLastRequest());
13 }
四、直接用已有報文請求
1 $params = array('track' => 1);
2 $client = new SoapClient(null, $params = null);
3 try {
4 $response = $client->__doRequest($xmlData, 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws', 'invEli', SOAP_1_2);
5 var_dump($response);
6 file_put_contents('./log.txt', $client->__getLastRequest());
7 } catch (SoapFault $e) {
8 print($e->getMessage);
9 file_put_contents('./log.txt', $client->__getLastRequest());
10 }
五、SoapVar的使用
SoapVar可以用來設置數據類型,數據類型空間,節點名稱,節點命名空間
六、示例説明
1、首先看一個請求地址:http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl (航天信息科技的測試地址)
直接在瀏覽器訪問該地址可以看到如下xml信息:
1 <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">
2 <wsdl:types>
3 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com">
4 <xsd:complexType name="ElectroniceInfo">...</xsd:complexType>
5 <xsd:complexType name="ArrayOfElectroniceDetail">...</xsd:complexType>
6 <xsd:complexType name="ElectroniceDetail">...</xsd:complexType>
7 <xsd:complexType name="ReturnElectronice">...</xsd:complexType>
8 <xsd:complexType name="ElectroniceStock">...</xsd:complexType>
9 </xsd:schema>
10 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://webservice.companyInterface.dzfp.fp.aisinogd.com">...</xsd:schema>
11 </wsdl:types>
12 <wsdl:message name="invEliRequest">
13 <wsdl:part name="parameters" element="tns:invEli"/>
14 </wsdl:message>
15 <wsdl:message name="queryEliDataRequest">
16 <wsdl:part name="parameters" element="tns:queryEliData"/>
17 </wsdl:message>
18 <wsdl:message name="queryEliDataResponse">
19 <wsdl:part name="parameters" element="tns:queryEliDataResponse"/>
20 </wsdl:message>
21 <wsdl:message name="queryEliStockRequest">
22 <wsdl:part name="parameters" element="tns:queryEliStock"/>
23 </wsdl:message>
24 <wsdl:message name="sendToInvEliResponse">
25 <wsdl:part name="parameters" element="tns:sendToInvEliResponse"/>
26 </wsdl:message>
27 <wsdl:message name="queryEliStockResponse">
28 <wsdl:part name="parameters" element="tns:queryEliStockResponse"/>
29 </wsdl:message>
30 <wsdl:message name="sendToInvEliRequest">
31 <wsdl:part name="parameters" element="tns:sendToInvEli"/>
32 </wsdl:message>
33 <wsdl:message name="invEliResponse">
34 <wsdl:part name="parameters" element="tns:invEliResponse"/>
35 </wsdl:message>
36 <wsdl:portType name="IEliWebServicePortType">
37 <wsdl:operation name="invEli">
38 <wsdl:input name="invEliRequest" message="tns:invEliRequest"/>
39 <wsdl:output name="invEliResponse" message="tns:invEliResponse"/>
40 </wsdl:operation>
41 <wsdl:operation name="queryEliData">
42 <wsdl:input name="queryEliDataRequest" message="tns:queryEliDataRequest"/>
43 <wsdl:output name="queryEliDataResponse" message="tns:queryEliDataResponse"/>
44 </wsdl:operation>
45 <wsdl:operation name="queryEliStock">
46 <wsdl:input name="queryEliStockRequest" message="tns:queryEliStockRequest"/>
47 <wsdl:output name="queryEliStockResponse" message="tns:queryEliStockResponse"/>
48 </wsdl:operation>
49 <wsdl:operation name="sendToInvEli">
50 <wsdl:input name="sendToInvEliRequest" message="tns:sendToInvEliRequest"/>
51 <wsdl:output name="sendToInvEliResponse" message="tns:sendToInvEliResponse"/>
52 </wsdl:operation>
53 </wsdl:portType>
54 <wsdl:binding name="IEliWebServiceHttpBinding" type="tns:IEliWebServicePortType">
55 <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
56 <wsdl:operation name="invEli">
57 <wsdlsoap:operation soapAction=""/>
58 <wsdl:input name="invEliRequest">
59 <wsdlsoap:body use="literal"/>
60 </wsdl:input>
61 <wsdl:output name="invEliResponse">
62 <wsdlsoap:body use="literal"/>
63 </wsdl:output>
64 </wsdl:operation>
65 <wsdl:operation name="queryEliData">
66 <wsdlsoap:operation soapAction=""/>
67 <wsdl:input name="queryEliDataRequest">
68 <wsdlsoap:body use="literal"/>
69 </wsdl:input>
70 <wsdl:output name="queryEliDataResponse">
71 <wsdlsoap:body use="literal"/>
72 </wsdl:output>
73 </wsdl:operation>
74 <wsdl:operation name="queryEliStock">
75 <wsdlsoap:operation soapAction=""/>
76 <wsdl:input name="queryEliStockRequest">
77 <wsdlsoap:body use="literal"/>
78 </wsdl:input>
79 <wsdl:output name="queryEliStockResponse">
80 <wsdlsoap:body use="literal"/>
81 </wsdl:output>
82 </wsdl:operation>
83 <wsdl:operation name="sendToInvEli">
84 <wsdlsoap:operation soapAction=""/>
85 <wsdl:input name="sendToInvEliRequest">
86 <wsdlsoap:body use="literal"/>
87 </wsdl:input>
88 <wsdl:output name="sendToInvEliResponse">
89 <wsdlsoap:body use="literal"/>
90 </wsdl:output>
91 </wsdl:operation>
92 </wsdl:binding>
93 <wsdl:service name="IEliWebService">
94 <wsdl:port name="IEliWebServiceHttpPort" binding="tns:IEliWebServiceHttpBinding">
95 <wsdlsoap:address location="http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws"/>
96 </wsdl:port>
97 </wsdl:service>
98 </wsdl:definitions>
可以用$client->instance->__getFunctions()); 和$client->instance->__getTypes());方法輸出需要請求的方法和攜帶的參數,但是參數結構是無法通過這裏面的信息理清的,最好是能夠有一份有效請求的xml。
2、再看一份有效請求的xml文件
1 <?xml version="1.0" encoding="GB2312"?>
2 <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/">
3 <soapenv:Header/>
4 <soapenv:Body>
5 <web:invEli>
6 <web:in0>
7 <!--Optional:-->
8 <pojo:BMB_BBH>1.0</pojo:BMB_BBH>
9 <!--Optional:-->
10 <pojo:BZ>測試水費發票</pojo:BZ>
11 <!--Optional:-->
12 <pojo:CHYY>衝紅原因</pojo:CHYY>
13 <!--Optional:-->
14 <pojo:CZDM>10</pojo:CZDM>
15 <!--Optional:-->
16 <pojo:DDH>SF201600001</pojo:DDH>
17 <!--Optional:-->
18 <pojo:DKBZ>1</pojo:DKBZ>
19 <!--Optional:-->
20 <pojo:DSPTBM></pojo:DSPTBM>
21 <!--Optional:-->
22 <pojo:EMAIL></pojo:EMAIL>
23 <!--Optional:-->
24 <pojo:EWM></pojo:EWM>
25 <!--Optional:-->
26 <pojo:FHR></pojo:FHR>
27 <!--Optional:-->
28 <pojo:FPQQLSH>751300550901125</pojo:FPQQLSH>
29 <!--Optional:-->
30 <pojo:FPZT></pojo:FPZT>
31 <!--Optional:-->
32 <pojo:FP_DM></pojo:FP_DM>
33 <!--Optional:-->
34 <pojo:FP_HM></pojo:FP_HM>
35 <!--Optional:-->
36 <pojo:FP_MW></pojo:FP_MW>
37 <!--Optional:-->
38 <pojo:GHFQYLX></pojo:GHFQYLX>
39 <!--Optional:-->
40 <pojo:GHF_DZ></pojo:GHF_DZ>
41 <!--Optional:-->
42 <pojo:GHF_EMAIL></pojo:GHF_EMAIL>
43 <!--Optional:-->
44 <pojo:GHF_GDDH></pojo:GHF_GDDH>
45 <!--Optional:-->
46 <pojo:GHF_MC>鳳凰新城項目部粵VSX018</pojo:GHF_MC>
47 <!--Optional:-->
48 <pojo:GHF_NSRSBH></pojo:GHF_NSRSBH>
49 <!--Optional:-->
50 <pojo:GHF_SF></pojo:GHF_SF>
51 <!--Optional:-->
52 <pojo:GHF_SJ></pojo:GHF_SJ>
53 <!--Optional:-->
54 <pojo:GHF_YHZH></pojo:GHF_YHZH>
55 <!--Optional:-->
56 <pojo:HJBHSJE>0</pojo:HJBHSJE>
57 <!--Optional:-->
58 <pojo:HJSE>0</pojo:HJSE>
59 <!--Optional:-->
60 <pojo:HY_DM></pojo:HY_DM>
61 <!--Optional:-->
62 <pojo:HY_MC></pojo:HY_MC>
63 <!--Optional:-->
64 <pojo:JQBH></pojo:JQBH>
65 <!--Optional:-->
66 <pojo:JYM></pojo:JYM>
67 <!--Optional:-->
68 <pojo:KPHJJE>127.36</pojo:KPHJJE>
69 <!--Optional:-->
70 <pojo:KPLX>1</pojo:KPLX>
71 <!--Optional:-->
72 <pojo:KPR>t</pojo:KPR>
73 <!--Optional:-->
74 <pojo:KPRQ></pojo:KPRQ>
75 <!--Optional:-->
76 <pojo:KPXM></pojo:KPXM>
77 <!--Optional:-->
78 <pojo:KP_NSRMC>新興縣供水工程管理處</pojo:KP_NSRMC>
79 <!--Optional:-->
80 <pojo:KP_NSRSBH>440001999999218</pojo:KP_NSRSBH>
81 <!--Optional:-->
82 <pojo:NSRDZDAH></pojo:NSRDZDAH>
83 <!--Optional:-->
84 <pojo:PYDM></pojo:PYDM>
85 <!--Optional:-->
86 <pojo:SJ></pojo:SJ>
87 <!--Optional:-->
88 <pojo:SKR></pojo:SKR>
89 <!--Optional:-->
90 <pojo:SWJG_DM></pojo:SWJG_DM>
91 <!--Optional:-->
92 <pojo:TSCHBZ>0</pojo:TSCHBZ>
93 <!--Optional:-->
94 <pojo:TSFS></pojo:TSFS>
95 <!--Optional:-->
96 <pojo:XHF_DH>020-22397388</pojo:XHF_DH>
97 <!--Optional:-->
98 <pojo:XHF_DZ>廣州市珠江東路32號規劃設計樓層39層全層(自編樓層41層全層)</pojo:XHF_DZ>
99 <!--Optional:-->
100 <pojo:XHF_MC>0022</pojo:XHF_MC>
101 <!--Optional:-->
102 <pojo:XHF_NSRSBH>440001999999218</pojo:XHF_NSRSBH>
103 <!--Optional:-->
104 <pojo:XHF_YHZH>721158340233</pojo:XHF_YHZH>
105 <!--Optional:-->
106 <pojo:YFP_DM></pojo:YFP_DM>
107 <!--Optional:-->
108 <pojo:YFP_HM></pojo:YFP_HM>
109 <!--Optional:-->
110 <pojo:appId></pojo:appId>
111 <!--Optional:-->
112 <pojo:authorizationCode></pojo:authorizationCode>
113 <!--Optional:-->
114 <pojo:codeType></pojo:codeType>
115 <!--Optional:-->
116 <pojo:content></pojo:content>
117 <!--Optional:-->
118 <pojo:dataExchangeId></pojo:dataExchangeId>
119 <!--Optional:-->
120 <pojo:details>
121
122
123 <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>
124 <!--Optional:-->
125 <pojo:encryptCode/>
126 <!--Optional:-->
127 <pojo:interfaceCode/>
128 <!--Optional:-->
129 <pojo:passWord/>
130 <!--Optional:-->
131 <pojo:requestCode/>
132 <!--Optional:-->
133 <pojo:responseCode/>
134 <!--Optional:-->
135 <pojo:terminalCode/>
136 <!--Optional:-->
137 <pojo:userName/>
138 <!--Optional:-->
139 <pojo:version/>
140 </web:in0>
141 </web:invEli>
142 </soapenv:Body>
143 </soapenv:Envelope>
根據以上信息可以確定invEli的數據結構(需要ElectroniceInfo),我們以數組的形式展示如下:
1 $methodParams = array('in0'=>array(
2 'userName'=>'14410101',
3 'passWord'=>'JWVFkqs7IP+++xBb1I9a/qr6/L/qYxyw==',
4 'FPQQLSH'=>'435351536253',
5 'DDH'=>'900122',
6 'KP_NSRSBH'=>'9144060073757157XN',
7 'KP_NSRMC'=>'即開即傳企業',
8 'DKBZ'=>'1',
9 'XHF_NSRSBH'=>'9144060073757157XN',
10 'XHF_MC'=>'即開即傳企業',
11 'XHF_DZ'=>'測試銷方地址',
12 'XHF_DH'=>'02083191299',
13 'XHF_YHZH'=>'21321321321',
14 'GHF_MC'=>'測試購方企業',
15 'KPR'=>'開票員',
16 'KPLX'=>'2',
17 'CZDM'=>'20',
18 'YFP_DM'=>'044001507111',
19 'YFP_HM'=>'14514790',
20 'KPHJJE'=>-100.00,
21 'BZ'=>'備註',
22 'details'=>array(array(
23 'XMMC'=>'測試商品',
24 'DW'=>'個',
25 'GGXH'=>'xxl',
26 'XMBM'=>'123321',
27 'XMSL'=>10.00,
28 'XMDJ'=>10.00,
29 'HSBZ'=>'1',
30 'XMJE'=>100.00,
31 'SL'=>'0.17',
32 'SE'=>14.53
33 ))
34 )
35 );
3、利用WSDL模式寫一個簡單的請求
1 $wsdlUrl = 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl';
2 $params = array('track' => 1);
3 $client = new SoapClient($wsdlUrl, $params = null);
4 try {
5 $resoponse = $client->invEli($methodParams);
6 var_dump($response);
7 file_put_contents('./log.txt', $client->__getLastRequest());
8 } catch (SoapFault $e) {
9 print($e->getMessage);
10 file_put_contents('./log.txt', $client->__getLastRequest());
11 }
4、使用non-WSDL模式請求
1 $params = array('location' => 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws',
2 'uri' => 'http://webservice.companyInterface.dzfp.fp.aisinogd.com',
3 'trace' => 1); // location為不帶?wsdl的地址,uri為targetNamespace
4 $client = new SoapClient(null, $params = null);
5 $methodParams = array(); // 為請求的參數,根據數據結構填寫
6 try {
7 $resoponse = $client->__soapCall(method, $methodParams);
8 var_dump($response);
9 file_put_contents('./log.txt', $client->__getLastRequest());
10 } catch (SoapFault $e) {
11 print($e->getMessage);
12 file_put_contents('./log.txt', $client->__getLastRequest());
13 }
14 數組中每一個參數可以用SoapVar設置類型和命名空間和節點
15 如使用$this->FPQQLSH = new SoapVar($params['FPQQLSH'], XSD_STRING, 'string', null, null, 'http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com'); //可將FPQQLSH設置成包含
16 'http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com'作為前綴的節點。