Ankündigung

Einklappen
Keine Ankündigung bisher.

Soap, wdsl, xml

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

  • Soap, wdsl, xml

    Hallo Zusammen,
    nach langem Suchen und Wühlen komme ich leider nicht weiter.
    Ich möchte eine SOAP Schnittstelle bedienen. Mir liegt eine WDSL und ein XML für den Datenrequest vor. Der SOAP-Aufruf funktioniert soweit. Ich bekomme zumindest die vorhandenen Functions zurückgemeldet.

    Es hakt bei mir die vorhandene XML der Schnittstelle richtig zu übergeben. In dieser stehen die Benutzerdaten (header) und die Paramater der an die Funktion zu übergeben sind drin.

    Egal was ich probiere bekomme ich entweder eine Fehlermeldung, dass kein username übergeben wurde (obwohl der in der XML drin steht) oder das die XML nicht valide ist (dies kann nicht sein, da es mit einem soapui4 funktioniert)

    Kann mir jemand weiterhelfen wo mein Denkfehler liegt?

    Source:
    PHP-Code:
    ...
              
    $soapclient = new SoapClient($wsdl,array('trace' => true,
                                                       
    'soap_version'   => SOAP_1_1,
                                                       ));

              
    $header = new SoapHeader(array('Username' => "xxxxx",
                                                          
    'Passsword'  => "xxxxx"));
              
    $soapclient->__setSoapHeaders($header);                                                   
              
              
    $xml '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:var="https://xxx/var3bl">';
              
    $xml .='<soapenv:Header>';
              
    $xml .='<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">';
              
    $xml .='<wsse:UsernameToken>';
              
    $xml .='<wsse:Username>xxxxx</wsse:Username>';
              
    $xml .='<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-tokenprofile1.0#PasswordText">xxxxx</wsse:Password>';
              
    $xml .='</wsse:UsernameToken>';
              
    $xml .='</wsse:Security></soapenv:Header>';
              
    $xml .= '<soapenv:Body>';
              
    $xml .= '<var:BookLabelRequest portalId="xxx" deliveryName="xxx" shipmentReference="xxx" customerReference="xxx" labelFormat="PDF" senderName1="xxx" />';
              
    $xml .= '</soapenv:Body>';  
              
    $xml .= '</soapenv:Envelope> ';

              
    // echo all of the functions defined in the wsdl
              
    echo "alle __getFunctions <br />";
              print(
    "<pre>");
              
    print_r($soapclient->__getFunctions());
              print(
    "</pre>");

              
    // echo all of the objects defined in the wsdl
              
    echo "alle __getTypes<br />";
              print(
    "<pre>");
              
    print_r($soapclient->__getTypes());
              print(
    "</pre>");
      
              
    print_r($soapclient->BookLabel($xml));       
            } catch (
    SoapFault $e) {
              echo 
    '<pre>'
              
    var_dump($e);
              
    var_dump($soapclient->__getFunctions());
              echo 
    '</pre>'
              echo 
    "<br><br>GET LAST REQUEST:<br><pre>";
              echo 
    "<pre>";
              echo  
    htmlentities($soapclient->__getLastRequest());
              echo 
    "</pre>";
              echo 
    "</pre>";
              echo 
    "<br><br>GET LAST RESPONSE :<br><pre>";
              echo 
    htmlentities($soapclient->__getLastResponse());
              echo 
    "</pre>";
              echo 
    "<pre>";
              echo 
    "GET LAST REQUEST HEADERS:\n" $soapclient->__getLastRequestHeaders() . "\n";
              echo 
    "</pre>";
              echo 
    "</pre>";
              echo 
    "<pre>";
              echo 
    "GET LAST RESPONSE HEADERS:\n" $soapclient->__getLastResponseHeaders() . "\n";
              echo 
    "</pre>";
            }
          
    ?> 
    Hier der Response vom SOAP-Dienst:

    PHP-Code:
    GET LAST REQUEST:

    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://xxx/var3bl"><SOAP-ENV:Header/><SOAP-ENV:Body><ns1:BookLabelRequest/></SOAP-ENV:Body></SOAP-ENV:Envelope>

    GET LAST RESPONSE :

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <env:Envelope xmlns:ns4="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:var3bl="https://xxx/var3bl" xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <env:Header/>
        <env:Body env:encodingStyle="">
            <env:Fault>
                <faultcode>ns4:FailedAuthentication</faultcode>
                <faultstring>Authentification failed: No username given</faultstring>
            </env:Fault>
        </env:Body>
    </env:Envelope>

    GET LAST REQUEST HEADERS:
    POST /xxx/SoapConnector HTTP/1.1
    Host: xxx.net
    Connection: Keep-Alive
    User-Agent: PHP-SOAP/5.3.3
    Content-Type: text/xml; charset=utf-8
    SOAPAction: ""
    Content-Length: 281

    Die XML enthält sowohl die User-Authentifizierung als die Parameterdaten für Funktion BookLabel. Wie muß ich die Daten richtig übergeben?

    Danke schon mal im voraus für Euere Hinweise. Habe hier im Forum leider nichts passendes gefunden. Toturals wie w3school, und hier das SOAP Totural hat mir leider nicht weitergeholfen.


  • #2
    Zum einen setzt du die Header falsch (siehe PHP-Manual) und warum übergibst du an BookLabel (Funktion des Webdienstes?) denn den kompletten SOAP-Envelope?!

    Kommentar


    • #3
      Hallo mquadrat,
      danke für deine Antwort. Ich denke den Header jetzt richtig gesetzt zu haben:

      PHP-Code:
              ini_set("soap.wsdl_cache_enabled""0");
              
      $wsdl "https://amsel.dpwn.net/abholportal/gw/lp/schema/1.0/var3ws.wsdl";
              try {
                
      $soapclient = new SoapClient($wsdl,array('trace' => true,
                                                         
      'soap_version'   => SOAP_1_2,
                                                         ));

                
      $headerbody = array('UsernameToken'=>array('Username'=>'xxx',
                                                   
      'Password'=>'xxx')); 
                                                   
                
      $header = new SoapHeader('https://xxx/SoapConnector','Security',$headerbody);
                
      $soapclient->__setSoapHeaders($header);                                                       
                
      $xml '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:var="https://xxx/schema/1.0/var3bl">';
                
      $xml .='<soapenv:Header>';
                
      $xml .='<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">';
                
      $xml .='<wsse:UsernameToken>';
                
      $xml .='<wsse:Username>xxx</wsse:Username>';
                
      $xml .='<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-tokenprofile1.0#PasswordText">xxx</wsse:Password>';
                
      $xml .='</wsse:UsernameToken>';
                
      $xml .='</wsse:Security></soapenv:Header>';

                
      $xml1 .= '<soapenv:Body>';
                
      $xml1 .= '<var:BookLabelRequest portalId="OnlineRetoure" deliveryName="Spanien_Var3" shipmentReference="ShipRef Nextt" customerReference="1.Feld via Webservice" .../>';
                
      $xml1 .= '</soapenv:Body>';  

                
      $xml .= '</soapenv:Envelope> ';

                
      print_r($soapclient->BookLabel($xml1));       
                
              } catch (
      SoapFault $e) {
                ...
              } 
      Zumindest bekomme ich keine Fehlermeldung mehr, dass die UserID fehlt.

      Allerdings komme ich mit dem Aufruf der Funktion und den zu übergebenen Parameter noch nicht zu recht.

      Kannst du mir hier nochmals helfen.

      PHP-Code:
      GET LAST REQUEST:

      <?xml version="1.0" encoding="UTF-8"?>
      <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="https://xxx/schema/1.0/var3bl" xmlns:ns2="https://xxx/SoapConnector"><env:Header><ns2:Security><item><key>UsernameToken</key><value><item><key>Username</key><value>xxx</value></item><item><key>Password</key><value>xxx</value></item></value></item></ns2:Security></env:Header><env:Body><ns1:BookLabelRequest/></env:Body></env:Envelope>


      GET LAST RESPONSE :

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <env:Envelope xmlns:ns4="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:var3bl="https://xxx/schema/1.0/var3bl" xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
          <env:Header/>
          <env:Body env:encodingStyle="">
              <env:Fault>
                  <faultcode>var3bl:InvalidXml</faultcode>
                  <faultstring>Invalid XML</faultstring>
              </env:Fault>
          </env:Body>
      </env:Envelope>

      GET LAST REQUEST HEADERS:
      POST /xxx/SoapConnector HTTP/1.1
      Host: xxx.net
      Connection: Keep-Alive
      User-Agent: PHP-SOAP/5.3.3
      Content-Type: application/soap+xml; charset=utf-8; action=""
      Content-Length: 528

      GET LAST RESPONSE HEADERS:
      HTTP/1.1 200 OK
      Date: Tue, 21 Jun 2011 09:28:55 GMT
      Content-Type: text/xml;charset=utf-8
      Content-Length: 619
      Connection: close
      Via: 1.1 xxx.net (Alteon iSD-SSL/5.1.5)
      Danke schon mal vorab für deine Rückinfo.

      Kommentar


      • #4
        In Unkenntnis von zumindest der WDSL-Datei, wenn nicht gar der Beschreibung des entsprechenden Webservices, wird Dir da niemand helfen können.

        Und: Invalid XML deutet mir nicht auf "richtig" hin.

        Außerdem: Dein Code müsste zumindest eine Notice werfen, wenn Du PHP denn gestattest, diese mitzuteilen.

        Gruß Jens

        Kommentar


        • #5
          Hallo Jens,
          die xml ist ganz oben im Script - diese funktioniert mit dem SOAPUI 4 (wie oben beschrieben.

          hier die wsdl:
          PHP-Code:
          <?xml version="1.0" encoding="UTF-8"?>
          <wsdl:definitions name="var3ws" 
              targetNamespace="https://xxx/gw/lp/schema/1.0/var3ws"
               xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
           xmlns:var3bl="https://xxx/schema/1.0/var3bl"
           xmlns:var3ws="https://xxx/gw/lp/schema/1.0/var3ws">

           <wsdl:import namespace="https://xxx/gw/lp/schema/1.0/var3bl" location="var3bl.xsd" />

           <wsdl:message name="BookLabelRequestMsg">
            <wsdl:part name="parameters" element="var3bl:BookLabelRequest"></wsdl:part>
           </wsdl:message>
           <wsdl:message name="BookLabelResponseMsg">
            <wsdl:part name="parameters" element="var3bl:BookLabelResponse"></wsdl:part>
           </wsdl:message>

           <wsdl:portType name="RpPartnerType">
            <wsdl:operation name="BookLabel">
             <wsdl:input message="var3ws:BookLabelRequestMsg"></wsdl:input>
             <wsdl:output message="var3ws:BookLabelResponseMsg"></wsdl:output>
            </wsdl:operation>
            
           </wsdl:portType>

           <wsdl:binding name="RpPartnerBinding" type="var3ws:RpPartnerType">
            <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
            <wsdl:operation name="BookLabel">
             <soap:operation soapAction="" style="document" />
             <wsdl:input>
              <soap:body use="literal" />
             </wsdl:input>
             <wsdl:output>
              <soap:body use="literal" />
             </wsdl:output>
            </wsdl:operation>
           </wsdl:binding>

           <wsdl:service name="RpPartnerService">
            <wsdl:port name="RpPartnerPort" binding="var3ws:RpPartnerBinding">
            <!-- 
                http://xxx/gw
             -->
             <!--  <soap:address location="<%= de.micromata.dhl.pop.DaoManager.get().getPublicApplicationUrl() %>/gw/ws/SoapConnector" />
              -->
              <soap:address location="https://xxx/gw/lp/SoapConnector"/>
            </wsdl:port>
           </wsdl:service>
          </wsdl:definitions>
          Ich verstehe nicht warum der Header falsch sein soll, wenn er die Userdaten annimmt und eine invalide xml meldet.

          Wäre toll wenn mir einfach jemand sagen kann wie dich die xml daten splitten muss, so das der soapheader und die Funktion BookLabel die richtigen Parameter erhalten.

          Danke schon mal vorab. Ist ganz schön kompliziert so ein SOAP Protokoll mit XML. Habe die letzten Tage nur Toturials und Dokus gelesen. Jetzt bin ich irgendwie noch verwirrter wie vorher.

          Kommentar


          • #6
            Hallo

            ist die extension=php_openssl.dll in der php.ini gesetzt?

            Probier einmal den Client so zu starten:
            $client = new SoapClient("https://yourLogin:yourPassword@url.wsdl", array(
            "login" => "yourLogin",
            "password" => "yourPassword",

            Kommentar


            • #7
              @jolly: SoapClient kann (noch) kein WS-Security oder hab ich da jetzt was völlig falsch in Erinnerung?

              WS-Security ist aber zum Glück mehr oder minder ein Standardverfahren. Die PHP-Umsetzung kannst Du Dir entweder im Manual aus den Contributed Notes zu SoapClient fischen oder aber Du nutzt einfach eine der fertigen Klassen im Netz. (z.B. die hier)

              Für den Parameter des Methodenaufrufs solltest Du Dir dann eine Klasse anlegen und diese entsprechend auf BookLabelRequestType mappen. Die notwendigen Attribute kannst Du ja hier auslesen oder via __getTypes() abfragen.

              Gruß Jens

              Kommentar


              • #8
                ich glaube es liest niemand so richtig was ich hier poste. Hmm oder stelle ich mir das ganze zu einfach vor?

                Nachdem ich den header angepasst habe bekomme ich kein Authenticatet Error mehr. Die gepostete XML ist richtig, da dies mit dem externen SOAP-Client ja funktioniert.

                Ich weiss nur nicht wie ich die fertige XML nun so an den SOAP-Client übergeben muss dass er diese auch erkennt.

                Wie muss ich den XML String auteilen oder zerlegen, dass der SOAP Client mir diesen auch richtig erkennt?

                @]jolly[: ja ist installiert und folgende Fehlermeldung:
                string(280) "SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://mein user:meinPasswort@https://xxx/gw/lp/schema/1.0/var3ws.wsdl' : failed to load external entity "https://user:meinPasswort@xxxgw/lp/schema/1.0/var3ws.wsdl"
                "

                Kommentar


                • #9
                  Nein - Du liest nicht richtig. Du musst kein XML übergeben. Das ist Dein hauptsächlicher Denkfehler.

                  Der Rest des Problems basiert mit hoher Wahrscheinlichkeit darauf, dass Du WS-Security nicht richtig implementiert hast. Alternativ kann es allerdings auch sein, dass Du das erst noch merken wirst.

                  Zu der Username+PW-Geschichte in der URL. In der Hinsicht ist PHP ziemlich verbugt. Username/PW-Geschützte WDSL vernünftig laden kann SoapClient bis heute einfach nicht.

                  Gruß Jens
                  P.S.: Bitte editier Deinen Code oben noch mal und nimm Username und PW da raus.

                  Kommentar


                  • #10
                    Versuch doch mal die NUSOAP Bibliothek...
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      NuSoap kann auch kein WS-Security-Usernametoken. Da musst Du vorher auch dran rum basteln.

                      Gruß Jens

                      Kommentar


                      • #12
                        Hab damit bisher nicht gearbeitet, daher ein Schuss ins Blaue...

                        Vielleicht sowas?
                        http://wso2.com/products/web-services-framework/php/

                        Zumindest wird geworben mit "delivers comprehensive WS-* based Web services support for the PHP world"...
                        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                        Kommentar


                        • #13
                          Zitat von snoopyatweb Beitrag anzeigen
                          ich glaube es liest niemand so richtig was ich hier poste. Hmm oder stelle ich mir das ganze zu einfach vor?
                          Eher zu kompliziert. Das XML wird von der verwendeten SOAP-Bibliothek generiert. Damit hat man - im Normalfall - nichts zu tun.

                          Kommentar

                          Lädt...
                          X