PHP und kein Soap-Aktionsheader

  • Ich versuche, einen Remote-Webdienst in meiner Firma anzurufen. Aus proprietären Gründen kann ich die URL für den Webservice nicht angeben. Der Webdienst hat eine einzige Funktion namens getItemField. Es ist ein kleiner Test-Dienst, für den ich versuche, PHP auszuführen. Die Dienstbeschreibung lautet wie folgt:

     <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://www.oracle.com/ws/MyFirstWebService" xmlns:intf="http://www.oracle.com/ws/MyFirstWebService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://www.w3.org/1999/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.oracle.com/ws/MyFirstWebService">
    <!--
    WSDL created by Apache Axis version: 1.2alpha Built on Oct 23, 2007 (12:09:54 IST)
    -->
    <wsdl:types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.oracle.com/ws/MyFirstWebService">
    <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
    <complexType name="ArrayOf_xsd_string">
    <complexContent>
    <restriction base="soapenc:Array">
    <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/>
    </restriction>
    </complexContent>
    </complexType>
    </schema>
    </wsdl:types>
    <message name="getItemFieldRequest">
    <part name="args" type="impl:ArrayOf_xsd_string"/>
    </message>
    <message name="getItemFieldResponse">
    <part name="getItemFieldReturn" type="soapenc:string"/>
    </message>
    <portType name="MyFirstWebService">
    <operation name="getItemField" parameterOrder="args">
    <input message="impl:getItemFieldRequest" name="getItemFieldRequest"/>
    <output message="impl:getItemFieldResponse" name="getItemFieldResponse"/>
    </operation>
    </portType>
    <binding name="MyFirstWebServiceSoapBinding" type="impl:MyFirstWebService">
    <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="getItemField">
    <wsdlsoap:operation soapAction=""/>
    <input name="getItemFieldRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://first" use="encoded"/>
    </input>
    <output name="getItemFieldResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://www.oracle.com/ws/MyFirstWebService" use="encoded"/>
    </output>
    </operation>
    </binding>
    <service name="MyFirstWebServiceService">
    <port binding="impl:MyFirstWebServiceSoapBinding" name="MyFirstWebService">
    <wsdlsoap:address location="http://myWebsite.com/services/MyFirstWebService"/>
    </port>
    </service>
    </definitions>
     

    Ich kann eine Verbindung zum Dienst herstellen und den Namen der einzelnen Funktionen und Typen ausdrucken. Wenn ich jedoch eine Funktion aufrufen möchte, erhalte ich den Fehler "SOAPAction-Header!" . Mein PHP-Code zum Aufrufen der Servicefunktion lautet wie folgt:

     $options = array(
                    // Dev
                    'soap_version'=>SOAP_1_2, 
                    'exceptions'=>true, 
                    'trace'=>1, 
                    'cache_wsdl'=>WSDL_CACHE_NONE,
                    'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
    
                    // Credentials
                    'login' => 'user', 
                    'password' => 'pass'
                );        
    
    // Connected successfully
                $client = new SoapClient( "http://myWebsite.com/services/MyFirstWebService?wsdl", $options );
    
        //Params
            $params = array( '123456' );
    
            //Options
            $options = array( 'soapaction' => '""' );
    
            //Call function (Both methods below throw the same 'no SOAPAction header!' error)
            //$result = $client->getItemField( new SoapParam($params, "getItemFieldRequest") );
            $result = $client->__soapCall( "getItemField", array('123456'), $options );
     

    Basierend auf der Beschreibung des Services, den es nicht verwendet Es scheint nicht, dass eine Seifenaktion definiert ist. Die Zeile, die ich mit soapAction sehe, ist <wsdlsoap:operation soapAction=""/>. Ich habe versucht, eine leere soapAction anzugeben, da keine definiert ist, aber das schien nicht zu funktionieren. Ist die Web-Service-Definition selbst unvollständig? Oder fehlt mir ein Parameter in meinem clientseitigen Anwendungsaufruf? Vielen Dank im Voraus.

    UPDATE:

    Es wurde versucht, den Methodennamen als Seifenaktion anzugeben, aber es hat nicht funktioniert.

         //Params
        $params = array( '123456' );
    
        //Options
        $options = array( 'soapaction' => 'getItemField' );
    
        //Call function (STILL THROWS 'no SOAPAction header!')
        $result = $client->__soapCall( "getItemField", $params, $options );
     

    Was soll ich tun, wenn im wsdl keine soapAction angegeben ist, dh wenn " ".

    22 November 2011
    kingrichard2005
1 answer
  • Es ist schwierig zu helfen, ohne alle erforderlichen Details zu haben. Ich empfehle Ihnen jedoch Folgendes:

     //Replace accordingly: see PHP Manual
    //(http://www.php.net/manual/en/soapheader.soapheader.php)
    
    $header = new SoapHeader($namespace, $name, $data, $mustunderstand, $actor);
    $client->__setSoapHeaders($header);
    
    //Main soap call follows....
     
    <|

    , bevor Sie den Soap-Service anrufen. Ich hoffe, das hilft.

    22 June 2012
    profnotime