Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Probleme mit SoapHeader ["Header not understood"]

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Probleme mit SoapHeader ["Header not understood"]

    Moin,

    ich sitze seit einigen Tagen an der Realisierung eines SOAP-Webservices. Die WSDL-Datei validiert und meine geschriebenen Klassen funktionieren auf dem lokalen Entwicklungssystem einwandfrei.

    Vorhin habe ich den Service dann zum Kunden migriert und bekomme nun vom SoapClient folgende Meldung: Header not understood

    Die Unterschiede zwischen Entwicklungssystem und Kundensystem sind eigentlich marginal. Bei mir läuft PHP in der Version 5.3.3 und beim Kunden in 5.3.2. Die installierten und geladenen Extensions (insbesondere natürlich SOAP) sind dieselben.

    Vielleicht findet ja einer von Euch den Fehler oder hat eine Problemlösung parat... ich bin für jeden noch so kleinen Tipp dankbar. Wirklich dankbar!

    An den Stellen im Code wo bishop.localhost steht, befindet sich eigentlich natürlich die entsprechend korrekte URI / URL des Kundensystems... nur um Schnellschüssen vorzubeugen.

    Beste Grüße aus Kiel,

    der Hauke

    Meine WSDL-Datei:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions name="StvmDefinitions" 
    	xmlns="http://schemas.xmlsoap.org/wsdl/"
    	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    	xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
    	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    	xmlns:tns="http://bishop.localhost/soap/"
    	targetNamespace="http://bishop.localhost/soap/">
    	
    	<wsdl:documentation>
    		WSDL Schnittstellenbeschreibung für die XXXXXXXXXX.
    	</wsdl:documentation>
    	
    	<wsdl:types>
    		<xsd:schema targetNamespace="http://www.bishop.localhost/soap/">
    
    			<xsd:complexType name="ResultFieldType">
    				<xsd:sequence>
    					<xsd:element name="resultField" type="xsd:string"/>
    				</xsd:sequence>
    			</xsd:complexType>
    			
    			<xsd:complexType name="ArrayOfResultFieldType">			
    				<xsd:sequence>
    					<xsd:element name="ArrayOfResultFields" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
    				</xsd:sequence>
    			</xsd:complexType>
    			
    			<xsd:complexType name="SearchFieldType">
    				<xsd:sequence>
    					<xsd:element name="fieldName" type="xsd:string"/>
    					<xsd:element name="fieldValue" type="xsd:string"/>
    				</xsd:sequence>
    			</xsd:complexType>
    			
    			<xsd:complexType name="ArrayOfSearchFieldType">			
    				<xsd:sequence>
    					<xsd:element name="ArrayOfSearchFields" type="tns:SearchFieldType" minOccurs="0" maxOccurs="unbounded"/>
    				</xsd:sequence>
    			</xsd:complexType>
    			
    			<xsd:complexType name="FoundRowArrayType">
    				<xsd:complexContent>
    					<xsd:restriction base="SOAP-ENC:Array">
    						<xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="SOAP-ENC:arrayType[]"/>
    					</xsd:restriction>
    				</xsd:complexContent>
    			</xsd:complexType>
    
    		</xsd:schema>
    	</wsdl:types>
    	
    	<message name="getAnbieterDataByAttributeRequest">
    		<part name="searchFields" type="tns:ArrayOfSearchFieldType"/>
    		<part name="resultFields" type="tns:ArrayOfResultFieldType"/>
    	</message>
    	
    	<message name="getAnbieterDataByAttributeResponse">
    		<part name="getAnbieterDataByAttributeReturn" type="tns:FoundRowArrayType"/>
    	</message>
    	
    	<message name="getAngeboteDataByAttributeRequest">
    		<part name="searchFields" type="tns:ArrayOfSearchFieldType"/>
    		<part name="resultFields" type="tns:ArrayOfResultFieldType"/>
    	</message>
    	
    	<message name="getAngeboteDataByAttributeResponse">
    		<part name="getAngeboteDataByAttributeReturn" type="tns:FoundRowArrayType"/>
    	</message>
    	
    	<wsdl:portType name="StvmDBPortType">
    		<wsdl:operation name="getAnbieterDataByAttribute">
    			<wsdl:input message="tns:getAnbieterDataByAttributeRequest"/>
    			<wsdl:output message="tns:getAnbieterDataByAttributeResponse"/>
    		</wsdl:operation>
    		<wsdl:operation name="getAngeboteDataByAttribute">
    			<wsdl:input message="tns:getAngeboteDataByAttributeRequest"/>
    			<wsdl:output message="tns:getAngeboteDataByAttributeResponse"/>
    		</wsdl:operation>
    	</wsdl:portType>
    	
    	<binding name="StvmDBBinding" type="tns:StvmDBPortType">
    	
    		<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    		
    		<wsdl:operation name="getAnbieterDataByAttribute">
    			<soap:operation soapAction="urn:STVM#getAnbieterDataByAttribute"/>
    			<wsdl:input>
    				<soap:body use="encoded" namespace="urn:STVM" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    			</wsdl:input>
    			<wsdl:output>
    				<soap:body use="encoded" namespace="urn:STVM" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    			</wsdl:output>
    		</wsdl:operation>
    		
    		<wsdl:operation name="getAngeboteDataByAttribute">
    			<soap:operation soapAction="urn:STVM#getAngeboteDataByAttribute"/>
    			<wsdl:input>
    				<soap:body use="encoded" namespace="urn:STVM" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    			</wsdl:input>
    			<wsdl:output>
    				<soap:body use="encoded" namespace="urn:STVM" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    			</wsdl:output>
    		</wsdl:operation>
    		
    	</binding>
    	
    	<wsdl:service name="StvmService">
    		<wsdl:port name="StvmDBPort" binding="tns:StvmDBBinding">
    			<soap:address location="http://bishop.localhost/soap/StvmServer.php"/>
    		</wsdl:port>
    	</wsdl:service>
    	
    </wsdl:definitions>
    Der "SOAP-Server":

    PHP-Code:
    <?php

    require_once 'StvmConfig.php';
    require_once 
    'StvmDB.class.php';

    ini_set'display_errors''on' );

    $options = array( 'uri' => SOAP_URI );

    $server = new SoapServer'StvmService.wsdl'$options );

    $server->setClass'StvmDB' );
    $server->setPersistenceSOAP_PERSISTENCE_SESSION );
    $server->handle();

    ?>
    Mein Test-Client:

    PHP-Code:
    <?php

    ini_set
    'display_errors''on' );

    $options = array(
        
    'cache_wsdl' => WSDL_CACHE_NONE,
        
    'trace' => 1,
    );

    class 
    authDataClass {
        
        public 
    $username;
        public 
    $password;
        
        public function 
    __construct$username$password ) {
            
    $this->username $username;
            
    $this->password $password;
        }
        
    };

    $authData = new authDataClass'hauke''geheim' );

    $wsdlFile 'http://bishop.localhost/soap/StvmService.wsdl';

    $headerData = new SoapVar$authDataSOAP_ENC_OBJECT );

    $header = new SoapHeader'http://bishop.localhost/soap/''authenticate'$headerDatatrue );

    $client = new SoapClient$wsdlFile );

    $client->__setSoapHeaders$header );

    $searchFields = array(
        array( 
    'fieldName' => 'uad_traeger_pattern''fieldValue' => 'kirche' ),
        array( 
    'fieldName' => 'uad_einrichtungart''fieldValue' => 'Kirche' ),
    );

    $responseFields = array(
        
    'uad_einrichtungname''uad_einrichtungart'
    );


    try {
        
    $res $client->getAngeboteDataByAttribute$searchFields$responseFields );
    } catch ( 
    SoapFault $f ) {
        echo 
    "\nTrace: "   print_r$f->getTrace(), true );
        echo 
    "\nMessage: " print_r$f->getMessage(), true );
        echo 
    "\nCode: "    print_r$f->getCode(), true );
    }

    echo 
    "\nErgebnis der Anfrage: \n";

    print_r$res );

    ?>

  • #2
    Welche Zeile im Code meldet Header not understood? Wie lauten die Header?

    error_reporting() auf E_ALL | E_STRICT?
    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

    Kommentar


    • #3
      Moin,

      die Meldung kommt aus der Exception SoapFault $f->GetMessage() sobald der Client die Methode getAngeboteDataByAttribute() aufruft.

      Das vom Client generierte XML sieht folgendermaßen aus:

      Code:
      <?xml version="1.0" encoding="UTF-8"?>
      <SOAP-ENV:Envelope
      	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
      	xmlns:ns1="urn:STVM"
      	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      	xmlns:ns2="http://www.##########/soap/"
      	xmlns:ns3="urn:http://www.##########/soap/"
      	xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
      	SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      	
      	<SOAP-ENV:Header>
      		<ns3:authenticate>
      			<username>hauke</username>
      			<password>geheim</password>
      		</ns3:authenticate>
      	</SOAP-ENV:Header>
      	
      	<SOAP-ENV:Body>
      	
      		<ns1:getAngeboteDataByAttribute>
      			
      			<searchFields xsi:type="ns2:ArrayOfSearchFieldType">
      				<ArrayOfSearchFields xsi:type="ns2:SearchFieldType">
      					<fieldName xsi:type="xsd:string">uad_traeger_pattern</fieldName>
      					<fieldValue xsi:type="xsd:string">kirche</fieldValue>
      				</ArrayOfSearchFields>
      			</searchFields>
      			
      			<resultFields xsi:type="ns2:ArrayOfResultFieldType">
      				<ArrayOfResultFields xsi:type="xsd:string">uad_einrichtungname</ArrayOfResultFields>
      				<ArrayOfResultFields xsi:type="xsd:string">uad_einrichtungart</ArrayOfResultFields>
      			</resultFields></ns1:getAngeboteDataByAttribute>
      			
      	</SOAP-ENV:Body>
      </SOAP-ENV:Envelope>

      Kommentar


      • #4
        So, der Vollständigkeit halber...

        Ich habe das Problem heute gelöst bzw. die Ursache für die Fehlermeldung gefunden. Ansatzpunkt war natürlich die Tatsache, dass es auf meinem Entwicklungssystem (PHP 5.3.3) tadellos funktioniert und beim Kunden (PHP 5.3.2) so überhaupt nicht.

        Im Nachhinein macht die Fehlermeldung "Header not understood" so auch richtig Sinn...

        Wenn man - so wie ich es zuerst auch getan habe - einen Methodenaufruf (zwecks Authentifizierung) und seine Parameter mittels SoapHeader an den SoapServer übergibt, muss dafür eigentlich die aufzurufende Funktion nicht in der WSDL-Datei angegeben sein.

        Setzt man die Methode jedoch mit <message> Signatur, <porttype> Definition und Binding in die WSDL akzeptiert der SoapServer den Aufruf über den Header problemlos.

        Folgendes sei hier noch angemerkt... (war mir vorher nicht so klar)

        Der SoapServer läuft auf zwei Arten. Entweder im WSDL-Modus oder im NON-WSDL Modus:

        PHP-Code:
        // WSDL Modus
        $server = new SoapServer 'uri://zur/wsdl/datei/'$options );

        // NON-WSDL Modul
        $options = array( 'uri' => 'uri://zum/php/SoapService.php' );
        $server = new SoapServer null$options ); 
        Das Problem tritt nur im WSDL-Modus auf. Letzteren möchte man aber meistens nutzen da es schon angenehm ist, wenn der SoapServer die übergebenen Werte gemäß der Spezifikationen aus der WSDL-Datei bekommt.

        HF & GL

        Kommentar

        Lädt...
        X