2011-06-03 4 views
2

私は、以下のリクエストとレスポンスの構造に従う必要があるSOAPサーバー(symfonyでckWebservicePluginを使用しています)を作成しています。PHP SoapServer: 'Response' appendingを無効にする方法

要求:

<?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> 

REPONSE:

<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 and Web Servicesで閲覧しましたが、SoapServerに応答名をどのように伝えるべきかを理解できません。

ありがとうございます。

答えて

2

はこの汚いSoapVarハックを試してみてください。

+0

ありがとう!後でそれを試してみましょう! – poisson

1

WSDLモードでSoapServerを作成しますか?私は、次のようにSoapServerを構築していることを意味します。

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

最初のパラメータはnullであってはなりません。 SoapServerは、WSDLに従ってレスポンスを作成する必要があります。とにかく問題がある場合は、PHPの最新リリースで試してみてください。それは(私も、あなたのWebサービスとそれをテストしていない)同様の問題に私のために働いてい

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

+0

ありがとうございました。 WSDLモードでサーバーを作成します。それに近づく様々な方法を試しました。 – poisson

+0

@xmedeko私も同様の問題があります。私はSOAP応答の 'ns1'ノードをカスタマイズしたいと思います。私の質問:http://stackoverflow.com/q/20836908/386579 –

関連する問題