2011-06-03 98 views
2

我正在創建一個SOAP服務器(在Symfony中使用ckWebservicePlugin),它需要符合以下結構的請求和響應(我被認爲是已經同意的規範)。PHP SoapServer:如何禁用'響應'追加

請求:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.example.net/schemas/USSD"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
    <USSDMessageRequest> 
     <id>43</id> 
     <msid>1234567890</msid> 
     <data>1*2</data> 
    </USSDMessageRequest> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

的回覆:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
    <USSDMessageResponse> 
     <id>43</id> 
     <msid>1234567890</msid> 
     <data> 
      RESPONSE DATA 
     </data> 
    </USSDMessageResponse> 
</SOAP-ENV:Body> 

時遇到的麻煩是SoapServer的始終產生響應如所附的請求的方法+ '響應' 的名。

所以響應XML正在發送出去看起來是這樣的:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://bw.petr.appsdev/bw/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Body> 
     <ns1:USSDMessageRequestResponse> 
     <result> 
      <id>2</id> 
      <msid>1234565789</msid> 
      <data>RESPONSE DATA</data> 
     </result> 
     </ns1:USSDMessageRequestResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

我想輸出爲<ns1:USSDMessageResponse>而非<ns1:USSDMessageRequestResponse>

的WSDL我使用看起來像這樣:

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="webservices" targetNamespace="http://bw.petr.appsdev/bw/" xmlns:tns="http://bw.petr.appsdev/bw/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> 
    <wsdl:types xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://bw.petr.appsdev/bw/"> 
     <xsd:complexType name="userCredentials"> 
     <xsd:sequence> 
      <xsd:element name="msisdn" type="xsd:string"/> 
      <xsd:element name="status" type="xsd:string"/> 
     </xsd:sequence> 
     </xsd:complexType> 
     <xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="userCredentialsElement" type="tns:userCredentials"/> 
     <xsd:complexType name="USSDResponse"> 
     <xsd:sequence> 
      <xsd:element name="id" type="xsd:string"/> 
      <xsd:element name="msid" type="xsd:string"/> 
      <xsd:element name="data" type="xsd:string"/> 
     </xsd:sequence> 
     </xsd:complexType> 
     <xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="USSDResponseElement" type="tns:USSDResponse"/> 
    </xsd:schema> 
    </wsdl:types> 
    <wsdl:portType name="webservicesPortType"> 
    <wsdl:operation name="USSDMessageRequest" parameterOrder="userCredentials id msid data"> 
     <wsdl:input message="tns:USSDMessageRequestRequest"/> 
     <wsdl:output message="tns:USSDMessageResponse" name="USSDMessageResponse"/> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="webservicesBinding" type="tns:webservicesPortType"> 
    <soap:binding xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="USSDMessageRequest"> 
     <soap:operation xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" soapAction="http://bw.petr.appsdev/bw/USSDMessageRequest" style="rpc"/> 
     <wsdl:input xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 
     <soap:body xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" parts="id msid data" use="literal" namespace="http://bw.petr.appsdev/bw/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
     <soap:header xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" message="tns:USSDMessageRequestRequest" part="userCredentials" use="literal" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
     </wsdl:input> 
     <wsdl:output xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 
     <soap:body xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" parts="result" use="literal" namespace="http://bw.petr.appsdev/bw/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
     <soap:header xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" message="tns:USSDMessageResponse" part="userCredentials" use="literal" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:message name="USSDMessageRequestRequest"> 
    <wsdl:part name="userCredentials" element="tns:userCredentialsElement"/> 
    <wsdl:part name="id" type="xsd:string"/> 
    <wsdl:part name="msid" type="xsd:string"/> 
    <wsdl:part name="data" type="xsd:string"/> 
    </wsdl:message> 
    <wsdl:message name="USSDMessageResponse"> 
    <wsdl:part name="userCredentials" element="tns:userCredentialsElement"/> 
    <wsdl:part name="result" type="tns:USSDResponse"/> 
    </wsdl:message> 
    <wsdl:service xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="webservicesService"> 
    <wsdl:port xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="webservicesPort" binding="tns:webservicesBinding"> 
     <soap:address xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" location="http://bw.petr.appsdev/bw/webservices.php"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

已經檢查了SoapServer文檔,通過R. Richards瀏覽Pro Xml和Web Services,並且無法弄清楚如何告訴SoapServer響應名稱應該是什麼。

謝謝。

回答

2

試試這個骯髒SoapVar黑客:

public function USSDMessageRequest() { 
     $result = '<ns1:USSDMessageResponse> ... </ns1:USSDMessageResponse>'; // ns1 is dirty, depends on the SoapServer implementation 
     $result = new SoapVar($result, XSD_ANYXML); 
     return $result; 
    } 

這爲我在一個類似的問題的工作(我還沒有和您的Web服務測試過,雖然)。

+0

謝謝!稍後會嘗試! – poisson 2011-08-04 12:37:33

1

您是否在WSDL模式下創建SoapServer?我的意思是你有像這樣構建SoapServer:

new SoapServer('path/to/wsdl', $options); 

第一個參數不能爲空。然後SoapServer應該根據WSDL創建響應。無論如何,如果您遇到麻煩,請嘗試使用最新版本的PHP。

+0

謝謝。我們以WSDL模式創建服務器。嘗試了各種不同的方法來處理它。 – poisson 2011-08-02 10:24:16

+0

@xmedeko我有類似的問題。我想在SOAP響應中定製'ns1'節點。我的問題:http://stackoverflow.com/q/20836908/386579 – 2013-12-30 13:57:10