php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 2 Stimmen, 3,00 durchschnittlich.
Alt 20.06.2011, 20:01  
Neuer Benutzer
 
Registriert seit: 28.12.2010
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
snoopyatweb befindet sich auf einem aufstrebenden Ast
Standard 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.
snoopyatweb ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 21.06.2011, 09:41  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Zum einen setzt du die Header falsch (siehe PHP-Manual) und warum übergibst du an BookLabel (Funktion des Webdienstes?) denn den kompletten SOAP-Envelope?!
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 21.06.2011, 11:41  
Neuer Benutzer
 
Registriert seit: 28.12.2010
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
snoopyatweb befindet sich auf einem aufstrebenden Ast
Standard

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.

Geändert von snoopyatweb (22.06.2011 um 20:01 Uhr).
snoopyatweb ist offline   Mit Zitat antworten
Alt 21.06.2011, 13:45  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

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
Jens Clasen ist offline   Mit Zitat antworten
Alt 21.06.2011, 14:23  
Neuer Benutzer
 
Registriert seit: 28.12.2010
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
snoopyatweb befindet sich auf einem aufstrebenden Ast
Standard

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.
snoopyatweb ist offline   Mit Zitat antworten
Alt 21.06.2011, 16:27  
Neuer Benutzer
 
Registriert seit: 16.06.2011
Beiträge: 18
PHP-Kenntnisse:
Fortgeschritten
]jolly[ befindet sich auf einem aufstrebenden Ast
Standard

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",
]jolly[ ist offline   Mit Zitat antworten
Alt 21.06.2011, 16:51  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

@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
Jens Clasen ist offline   Mit Zitat antworten
Alt 21.06.2011, 17:36  
Neuer Benutzer
 
Registriert seit: 28.12.2010
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
snoopyatweb befindet sich auf einem aufstrebenden Ast
Standard

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

Geändert von snoopyatweb (22.06.2011 um 19:58 Uhr).
snoopyatweb ist offline   Mit Zitat antworten
Alt 22.06.2011, 09:02  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

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.
Jens Clasen ist offline   Mit Zitat antworten
Alt 22.06.2011, 11:46  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Versuch doch mal die NUSOAP Bibliothek...
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
API - SOAP - SimpleXML princemichi Software-Design 6 17.03.2011 22:44
Authentifikation bei SOAP? dennis81 PHP-Fortgeschrittene 17 14.03.2011 20:00
WSDL Zugriff SOAP (Authenifizierung) PatrickStar88 PHP-Fortgeschrittene 1 01.12.2010 12:24
SOAP, MySQL Beispielcode Ralf Meyer PHP Tipps 2010 8 16.11.2010 14:47
Scriptsuche Soap Schnittstelle mit eigener class mawiba Scriptbörse 0 09.12.2009 15:07
Probleme mit SOAP über HTTPS - Timeouts soesti PHP Tipps 2009 0 30.09.2009 14:44
Amazon Webservices - SOAP nimmt Signature nicht Lennynero PHP Tipps 2009 0 24.08.2009 10:41
SOAP API von validator.w3.org auslesen Sascha1976 PHP Tipps 2009 3 03.07.2009 18:34
SOAP Dokumentelstil Mad_Dog PHP-Fortgeschrittene 2 19.09.2008 20:27
Fragen und Verwendung der SOAP Erweiterung von PHP Tanja PHP-Fortgeschrittene 5 15.09.2008 09:29
Größenbeschränkung bei PEAR SOAP Antwort? Anotherone PHP-Fortgeschrittene 1 13.01.2008 20:32
SOAP Server Parameter richtig zuordnen Anotherone PHP Tipps 2008 0 12.12.2007 11:23
php5 soap extension, soap attachment zcmaster PHP-Fortgeschrittene 0 07.08.2006 16:09
SOAP und PHP cola PHP-Fortgeschrittene 21 01.06.2006 11:33
[Erledigt] XML String an Webservice übergeben (SOAP) PHP-Fortgeschrittene 3 26.08.2005 12:40

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
https://amsel.dpwn.net/abholportal/gw/lp/schema/1.0/var3ws.wsdl, var3ws.wsdl, php soap dhl retoure, dhl retoure webservice, dhl soap php, https://amsel.dpwn.net/abholportal/gw/lp/soapconnector, php dhl webservice, php soap wss, soap aufruf, funktionen des webdienstes abfragen php soap, php soap header password übergeben, php soap security oasis-open.org/wss/2004/01/oasis, portalid dhl schnittstelle, dhl retoure invalid xml, php soap header wsdl, alteon isd-ssl/5.1.5, dhl retoure soap, var3ws, var3bl:invalidxml, soap php dhl

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:58 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum