Mickymaus: PHP soap

Guten Tag,

ich hatte vor einiger Zeit schonmal gefragt, da das aber nun ein bisschen her ist, fange ich mal ein neues Thema an.

Altes Thema hier: http://forum.de.selfhtml.org/?t=211466&m=1443021

Wie bereits gesagt, versuche ich zum öffentlichen endpoint test.com/wsdl eine SOAP Verbindung herzustellen. Bisher hatte ich es so versucht:

Client = new SoapClient($wsdl,array('user' => "user",'password' => "pw"));

Ging aber nie, deswegen habe ich mal ein bisschen rumprobiert. Es liegt ja hier ein Proxy vor, dieser ist möglicherweise daran Schuld, dass meine SOAP Anfragen fehlschlagen. Dann ist mir aufgefallen, dass es laut dem Manual http://at2.php.net/manual/de/soapclient.soapclient.php ja extra Parameter für Proxys gibt.Also habe ich das hier hinzugefügt zum Optionen-Array:

~~~php 'proxy_host' => 'proxy',
        'proxy_port' => 8080,
        'proxy_login' => 'proxyusername',
        'proxy_password' => 'proxypass',

  
Übergeben habe ich nun also Die Proxydaten, meine Einlogdaten für den Proxy und meine Einlogdaten für den SOAP Service. Zurück kommt immer noch nur ein "cant load external entity".  
  
Und ja, die WSDL Adresse ist im Browser ohne Probleme aufrufbar, es erscheint ein XML File.  
  
Außerdem habe ich noch probiert über file\_get\_contents() das File local zu chachen (musste erst umständlich einen entsprechenden Stream erstellen), was aber auch fehlschlug.  
  
Mir gehen absolut die Ideen aus und ich weiß weder woran es liegt, noch wie man das ganze beheben kann.  
  
Hat jemand von euch einen Tipp?  
  

  1. Außerdem habe ich noch probiert über file_get_contents() das File local zu chachen (musste erst umständlich einen entsprechenden Stream erstellen), was aber auch fehlschlug.

    "aber auch fehlschlug" bedeutet genau?

    1. "aber auch fehlschlug" bedeutet genau?

      Das bedeutet das folgender Code:

      $auth = base64_encode('KHD\proxyuser:proxypass');  
      $header = array("Proxy-Authorization: Basic $auth");  
      $aContext = array(  
          'http' => array(  
              'proxy' => 'proxy.de:8080',  
              'request_fulluri' => true,  
      	   'header' => $header,  
          ),  
      );  
      $cxContext = stream_context_create($aContext);  
        
      $wsdl = file_get_contents('example.com/?wsdl',false,$cxContext);  
      echo $wsdl;
      

      Dann die gesamte gecatchte wsdl Datei ausgibt und anschließend:

        
      $auth_client = new SoapClient($wsdl, array('user'=>'soapuser', 'password'=>'soappassword'));  
      $auth_response = $auth_client->authenticate();
      

      Mit der Fehlermeldung "Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from '<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="

      abbricht.

      1. hi

        $wsdl = file_get_contents('example.com/?wsdl',false,$cxContext);
        echo $wsdl;[/code]

        Dann die gesamte gecatchte wsdl Datei ausgibt und anschließend:

        $auth_client = new SoapClient($wsdl, array('user'=>'soapuser', 'password'=>'soappassword'));
        $auth_response = $auth_client->authenticate();

        
        >   
        > Mit der Fehlermeldung "Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from '<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="  
        >   
          
        warum übergibst du als Parameter einen String, der den Inhalt einer wsdl-Datei enthält?  Warum übergibst du ihm nicht einen Pfad zu einer gespeicherten wsdl-Datei?  
          
        Die Fehlermeldung sagts ja schon: could not load FROM ...  
          
        
        
        1. warum übergibst du als Parameter einen String, der den Inhalt einer wsdl-Datei enthält?  Warum übergibst du ihm nicht einen Pfad zu einer gespeicherten wsdl-Datei?

          Die Fehlermeldung sagts ja schon: could not load FROM ...

          Ich habe ihm wie gesagt auch schon die direkte URL übergeben und es hat nicht funktioniert, oder meintest du jetzt gerade, dass ich das WSDL file per fwrite() oder so lokal speichern soll?

          1. hi,

            Ich habe ihm wie gesagt auch schon die direkte URL übergeben und es hat nicht funktioniert, oder meintest du jetzt gerade, dass ich das WSDL file per fwrite() oder so lokal speichern soll?

            genau. Lokal auf Platte speichern und dann Pfad übergeben.

            1. $auth = base64_encode('KHD\user:pass');  
              $header = array("Proxy-Authorization: Basic $auth");  
              $aContext = array(  
                  'http' => array(  
                      'proxy' => 'proxy.de:8080',  
                      'request_fulluri' => true,  
              	   'header' => $header,  
                  ),  
              );  
              $cxContext = stream_context_create($aContext);  
                
              $wsdl = file_get_contents('http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl',false,$cxContext);  
                
              $test = fopen("test.txt","w+");  
              fwrite($test,$wsdl);  
              fclose($test);  
              $auth_client = new SoapClient("test.txt");  
              $auth_response = $auth_client->authenticate();
              

              Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host in E:\xampp\htdocs\test.php:44 Stack trace: #0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://search.w...', '', 1, 0) #1 E:\xampp\htdocs\test.php(44): SoapClient->__call('authenticate', Array) #2 E:\xampp\htdocs\test.php(44): SoapClient->authenticate() #3 {main} thrown in E:\xampp\htdocs\test.php on line 44

              1. $auth = base64_encode('KHD\user:pass');

                $header = array("Proxy-Authorization: Basic $auth");
                $aContext = array(
                    'http' => array(
                        'proxy' => 'proxy.de:8080',
                        'request_fulluri' => true,
                   'header' => $header,
                    ),
                );
                $cxContext = stream_context_create($aContext);

                $wsdl = file_get_contents('http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl',false,$cxContext);

                das war die Datei für den Auth-Vorgang.

                $test = fopen("test.txt","w+");
                fwrite($test,$wsdl);
                fclose($test);
                $auth_client = new SoapClient("test.txt");
                $auth_response = $auth_client->authenticate();

                
                >   
                > Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host in E:\xampp\htdocs\test.php:44 Stack trace: #0 [internal function]: SoapClient->\_\_doRequest('<?xml version="...', 'http://search.w...', '', 1, 0) #1 E:\xampp\htdocs\test.php(44): SoapClient->\_\_call('authenticate', Array) #2 E:\xampp\htdocs\test.php(44): SoapClient->authenticate() #3 {main} thrown in E:\xampp\htdocs\test.php on line 44  
                  
                hier wird versucht, in Zeile 44 deiner Datei test.php auf eine andere Datei zuzugreifen, was scheitert. Bitte nenne uns den Namen dieser Datei.
                
                1. Nun wie gesagt, ich habe von SOAP keine Ahnung. Zeile 44 in test.php ist diese hier:

                  $auth_response = $auth_client->authenticate();

                  Soweit ich das bis jetzt verstehe ruft der nun die per wsdl festgelegte soap authenticate() Anfrage auf, um mich zu identifizieren. Die dann aber fehlschlägt warum auch immer. Folglich müsste der Inhalt von test.txt also der gecatchten wsdl file weiterhelfen (mit der ich mangels Wissen nichts anfangen kann).

                  <?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="WOKMWSAuthenticateService" targetNamespace="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                    <wsdl:types>
                  <xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                  <xs:element name="authenticate" type="tns:authenticate" />
                  <xs:element name="authenticateResponse" type="tns:authenticateResponse" />
                  <xs:element name="closeSession" type="tns:closeSession" />
                  <xs:element name="closeSessionResponse" type="tns:closeSessionResponse" />
                  <xs:element name="roamingAuthenticate" type="tns:roamingAuthenticate" />
                  <xs:element name="roamingAuthenticateResponse" type="tns:roamingAuthenticateResponse" />
                  <xs:complexType name="closeSession">
                  <xs:sequence />
                  </xs:complexType>
                  <xs:complexType name="closeSessionResponse">
                  <xs:sequence />
                  </xs:complexType>
                  <xs:complexType name="roamingAuthenticate">
                  <xs:sequence>
                  <xs:element minOccurs="1" name="username" type="xs:string" />
                  <xs:element minOccurs="1" name="password" type="xs:string" />
                  </xs:sequence>
                  </xs:complexType>
                  <xs:complexType name="roamingAuthenticateResponse">
                  <xs:sequence>
                  <xs:element minOccurs="0" name="return" type="xs:string" />
                  </xs:sequence>
                  </xs:complexType>
                  <xs:complexType name="authenticate">
                  <xs:sequence />
                  </xs:complexType>
                  <xs:complexType name="authenticateResponse">
                  <xs:sequence>
                  <xs:element minOccurs="0" name="return" type="xs:string" />
                  </xs:sequence>
                  </xs:complexType>
                  <xs:element name="QueryException" type="tns:QueryException" />
                  <xs:complexType name="QueryException">
                  <xs:sequence />
                  </xs:complexType>
                  <xs:element name="SessionException" type="tns:SessionException" />
                  <xs:complexType name="SessionException">
                  <xs:sequence />
                  </xs:complexType>
                  <xs:element name="AuthenticationException" type="tns:AuthenticationException" />
                  <xs:complexType name="AuthenticationException">
                  <xs:sequence />
                  </xs:complexType>
                  <xs:element name="InvalidInputException" type="tns:InvalidInputException" />
                  <xs:complexType name="InvalidInputException">
                  <xs:sequence />
                  </xs:complexType>
                  <xs:element name="InternalServerException" type="tns:InternalServerException" />
                  <xs:complexType name="InternalServerException">
                  <xs:sequence />
                  </xs:complexType>
                  <xs:element name="ESTIWSException" type="tns:ESTIWSException" />
                  <xs:complexType name="ESTIWSException">
                  <xs:sequence />
                  </xs:complexType>
                  </xs:schema>
                    </wsdl:types>
                    <wsdl:message name="authenticate">
                      <wsdl:part element="tns:authenticate" name="parameters">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="InvalidInputException">
                      <wsdl:part element="tns:InvalidInputException" name="InvalidInputException">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="InternalServerException">
                      <wsdl:part element="tns:InternalServerException" name="InternalServerException">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="closeSession">
                      <wsdl:part element="tns:closeSession" name="parameters">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="roamingAuthenticate">
                      <wsdl:part element="tns:roamingAuthenticate" name="parameters">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="ESTIWSException">
                      <wsdl:part element="tns:ESTIWSException" name="ESTIWSException">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="AuthenticationException">
                      <wsdl:part element="tns:AuthenticationException" name="AuthenticationException">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="closeSessionResponse">
                      <wsdl:part element="tns:closeSessionResponse" name="parameters">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="authenticateResponse">
                      <wsdl:part element="tns:authenticateResponse" name="parameters">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="QueryException">
                      <wsdl:part element="tns:QueryException" name="QueryException">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="SessionException">
                      <wsdl:part element="tns:SessionException" name="SessionException">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:message name="roamingAuthenticateResponse">
                      <wsdl:part element="tns:roamingAuthenticateResponse" name="parameters">
                      </wsdl:part>
                    </wsdl:message>
                    <wsdl:portType name="WOKMWSAuthenticate">
                      <wsdl:operation name="closeSession">
                        <wsdl:input message="tns:closeSession" name="closeSession">
                      </wsdl:input>
                        <wsdl:output message="tns:closeSessionResponse" name="closeSessionResponse">
                      </wsdl:output>
                        <wsdl:fault message="tns:InvalidInputException" name="InvalidInputException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:InternalServerException" name="InternalServerException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:ESTIWSException" name="ESTIWSException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:AuthenticationException" name="AuthenticationException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:QueryException" name="QueryException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:SessionException" name="SessionException">
                      </wsdl:fault>
                      </wsdl:operation>
                      <wsdl:operation name="roamingAuthenticate">
                        <wsdl:input message="tns:roamingAuthenticate" name="roamingAuthenticate">
                      </wsdl:input>
                        <wsdl:output message="tns:roamingAuthenticateResponse" name="roamingAuthenticateResponse">
                      </wsdl:output>
                        <wsdl:fault message="tns:InvalidInputException" name="InvalidInputException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:InternalServerException" name="InternalServerException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:ESTIWSException" name="ESTIWSException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:AuthenticationException" name="AuthenticationException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:SessionException" name="SessionException">
                      </wsdl:fault>
                      </wsdl:operation>
                      <wsdl:operation name="authenticate">
                        <wsdl:input message="tns:authenticate" name="authenticate">
                      </wsdl:input>
                        <wsdl:output message="tns:authenticateResponse" name="authenticateResponse">
                      </wsdl:output>
                        <wsdl:fault message="tns:InvalidInputException" name="InvalidInputException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:InternalServerException" name="InternalServerException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:ESTIWSException" name="ESTIWSException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:AuthenticationException" name="AuthenticationException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:QueryException" name="QueryException">
                      </wsdl:fault>
                        <wsdl:fault message="tns:SessionException" name="SessionException">
                      </wsdl:fault>
                      </wsdl:operation>
                    </wsdl:portType>
                    <wsdl:binding name="WOKMWSAuthenticateServiceSoapBinding" type="tns:WOKMWSAuthenticate">
                      <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
                      <wsdl:operation name="closeSession">
                        <soap:operation soapAction="" style="document" />
                        <wsdl:input name="closeSession">
                          <soap:body use="literal" />
                        </wsdl:input>
                        <wsdl:output name="closeSessionResponse">
                          <soap:body use="literal" />
                        </wsdl:output>
                        <wsdl:fault name="InvalidInputException">
                          <soap:fault name="InvalidInputException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="InternalServerException">
                          <soap:fault name="InternalServerException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="ESTIWSException">
                          <soap:fault name="ESTIWSException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="AuthenticationException">
                          <soap:fault name="AuthenticationException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="QueryException">
                          <soap:fault name="QueryException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="SessionException">
                          <soap:fault name="SessionException" use="literal" />
                        </wsdl:fault>
                      </wsdl:operation>
                      <wsdl:operation name="roamingAuthenticate">
                        <soap:operation soapAction="" style="document" />
                        <wsdl:input name="roamingAuthenticate">
                          <soap:body use="literal" />
                        </wsdl:input>
                        <wsdl:output name="roamingAuthenticateResponse">
                          <soap:body use="literal" />
                        </wsdl:output>
                        <wsdl:fault name="InvalidInputException">
                          <soap:fault name="InvalidInputException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="InternalServerException">
                          <soap:fault name="InternalServerException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="ESTIWSException">
                          <soap:fault name="ESTIWSException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="AuthenticationException">
                          <soap:fault name="AuthenticationException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="SessionException">
                          <soap:fault name="SessionException" use="literal" />
                        </wsdl:fault>
                      </wsdl:operation>
                      <wsdl:operation name="authenticate">
                        <soap:operation soapAction="" style="document" />
                        <wsdl:input name="authenticate">
                          <soap:body use="literal" />
                        </wsdl:input>
                        <wsdl:output name="authenticateResponse">
                          <soap:body use="literal" />
                        </wsdl:output>
                        <wsdl:fault name="InvalidInputException">
                          <soap:fault name="InvalidInputException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="InternalServerException">
                          <soap:fault name="InternalServerException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="ESTIWSException">
                          <soap:fault name="ESTIWSException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="AuthenticationException">
                          <soap:fault name="AuthenticationException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="QueryException">
                          <soap:fault name="QueryException" use="literal" />
                        </wsdl:fault>
                        <wsdl:fault name="SessionException">
                          <soap:fault name="SessionException" use="literal" />
                        </wsdl:fault>
                      </wsdl:operation>
                    </wsdl:binding>
                    <wsdl:service name="WOKMWSAuthenticateService">
                      <wsdl:port binding="tns:WOKMWSAuthenticateServiceSoapBinding" name="WOKMWSAuthenticatePort">
                        <soap:address location="http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate" />
                      </wsdl:port>
                    </wsdl:service>
                  </wsdl:definitions>
                  
                  1. ich vermute, du musst den Endpoint setzen

                      
                      
                    DEIN_SOAPENDPOINT = http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate  
                      
                      
                    try{  
                    			$this->soapClient = new SoapClient(URL_ZUR_WSDL, array('trace' => 1, 'login' => "dein_loginname", 'password' => "dein_password"));  
                    			  
                    			$this->soapClient->__setLocation(DEIN_SOAPENDPOINT);  
                    		}  
                    		catch(SoapFault $fault) {  
                      
                    			echo 'faultstring: '.$fault->faultstring."\n";  
                    			print_r($fault);  
                    		}  
                      
                    
                    
  2. öffentlichen endpoint test.com/wsdl

    Dort gibt's keine WSDL-Ressource. Möchtest du nicht mal echte Daten zum Nachvollziehen rausrücken? Dann kann man praktische Hilfe leisten, nicht bloß allgemeine Vermutungen anstellen.

    1. Kann ich sehr gerne machen:

      http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl

      Das ist der öffentliche Endpoint für die Web of Science Web Services. Auf diese möchte ich zugreifen können, würde dafür seitens Thomson Reuters samt Username + Password freigeschaltet. Klappen tut es allerdings nicht.