php.de

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

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 11.05.2011, 11:36  
Neuer Benutzer
 
Registriert seit: 01.03.2011
Beiträge: 16
PHP-Kenntnisse:
Anfänger
Nico befindet sich auf einem aufstrebenden Ast
Standard SoapClient -> Ändern der Request Struktur, sinnvoll, möglich?

Hallo,

ich habe das Problem ein Soap-Request zu erzeugen, welches von der Gegenseite verstanden wird. Ich entwickel nur den Clienten, der Server wird von anderen Entwickelt und ich habe dort keinen Einblick in die Struktur.

Ich benutze die Soap-Klasse von PHP:

PHP-Code:
$client = new SoapClient('http://firma.de/Service.asmx?WSDL', array(
    
'url' => 'http://firma.de/Service.asmx?WSDL',
    
'soap_version'  => SOAP_1_2,
));

$param1 = <<<EOC;
<
Client>
    <!-- 
Es wird eine inntere XML-Struktur übergebenwelche <Clientals Root element hat und noch weiter verzweigt ist,
         die < 
und werden nicht escaped -->
</
Client>
EOC;

$client->__soapCall("Method", array(new SoapVar($param1XSD_ANYXML))); 
Ich lasse mir nochmal zur Sicherheit den Vollständigen Request ausgeben mit $client->__getLastRequest():

Code:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://firma.de/"><env:Body>
    <Client>
        <!-- Es wird eine inntere XML-Struktur übergeben, welche <Client> als Root element hat und noch weiter verzweigt ist,
             die < und > werden nicht escaped -->
    </Client>
</env:Body></env:Envelope>
Der Request funktioniert grundlegend Richtig und ich erhalte eine Antwort mit einer von der Gegenseite selbst definierten Meldung. Leider eine Fehlermeldung.
Ich habe mal nachgefragt, wie ein Korrekter Request für meine Anfrage aussehen müsste, und habe folgenden Request bekommen:

Code:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:firma="http://firma.de/">
   <soapenv:Header/>
   <soapenv:Body>
      <firma:Method>
         <!--Optional:-->
         <firma:Parameter1>
            <Client>
                <!-- Es wird eine inntere XML-Struktur übergeben, welche <Client> als Root element hat und noch weiter verzweigt ist,
                     die < und > werden nicht escaped -->
            </Client>
         </firma:Parameter1>
      </firma:Method>
   </soapenv:Body>
</soapenv:Envelope>
Da sich die Struktur ja vollständig von meiner Unterscheidet, habe ich versucht, SoapClient::__doRequest zu überschreiben ... ich entferne alles wieder bis ich in meinem Client-Element angekommen bin, und setze den Rest drum herum:

PHP-Code:
public function __doRequest($request, $location, $action, $version)
{
        $request = str_replace('<?xml version="1.0" encoding="UTF-8"?>', '', $request);
        $request = str_replace('<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://firma.de/"><env:Body>', '', $request);
        $request = str_replace('</env:Body></env:Envelope>', '', $request);
        
        $prefix = <<<EOL
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:firma="http://firma.de/">
   <soapenv:Header/>
   <soapenv:Body>
      <firma:Method>
         <!--Optional:-->
         <firma:Parameter1>
EOL;

        $suffix = <<<EOL
         </firma:Parameter1>
      </firma:Method>
   </soapenv:Body>
</soapenv:Envelope>

EOL;

    $request = $prefix.$request.$suffix;
    return parent::__doRequest($request, $location, $action, $version);
}
Hier erhalte ich nun von meiner Seite aus die Fehlermeldung: Unsupported Media Type.

Hat vielleicht jemand eine Idee, wie ich das Lösen kann?

Gruß
Nico
Nico ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

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

Wenn du im WSDL-Modus bist, dann werden die Methoden, die der Dienst anbietet als Methoden deines Client-Objekts zur Verfügung gestellt. Hattest du das mal probiert? Durch direktes Aufrufen von __soapCall verliert man all die schönen Vorteile...
__________________
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 11.05.2011, 16:43  
Neuer Benutzer
 
Registriert seit: 01.03.2011
Beiträge: 16
PHP-Kenntnisse:
Anfänger
Nico befindet sich auf einem aufstrebenden Ast
Standard

Hallo mquadrat,

ja, das habe ich bereits Probiert, ich dachte mit der __soapCall-Methode kann ich ein wenig flexibler sein. Wenn ich die direkte Methode nutze, spuckt er mir trotzdem nicht das richtige Format aus.

Ich weis nicht welche Bedeutung der Namespace des Request für eine Rolle spielt (<soapenv:...), ich bekomme aber immer wieder Fehlermeldungen von meiner Seite aus wenn ich versuche das "hart" zu ändern. Auf jedenfall ein wichtiger Punkt ist die Struktur ab dem Body-Element. <firma:Methode><firma:Parameter1>...hier xml content...</firma:Parameter1></firma:Methode>. Diese Struktur bekomme ich nicht hin.

Eventuell kann mir jemand einen Hinweis geben, wie ich so einen Request per Hand abschicke, sprich komplett ohne Soap und seinen ablegern. Ich vermute, da muss man nur eine URL mit bestimmten werden aufrufen .. oder?
Nico ist offline   Mit Zitat antworten
Alt 12.05.2011, 11:19  
Neuer Benutzer
 
Registriert seit: 01.03.2011
Beiträge: 16
PHP-Kenntnisse:
Anfänger
Nico befindet sich auf einem aufstrebenden Ast
Standard

Hallo!

Ich habe das Problem jetzt über cURL gelöst. Ein paar gute Hinweise habe ich unter http://forum.de.selfhtml.org/archiv/2009/9/t190511/ gefunden. Vielleicht ist noch ein wenig Feintuning notwendig, in unseren Testumgebungen läuft das alles Problemlos.

Gruß
Nico
Nico ist offline   Mit Zitat antworten
Alt 12.05.2011, 16:19  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Naja, gehen tut das - aber einen SOAP Service von Hand aufzurufen macht halt nicht den ganz großen Sinn. Aber wenn du nur die eine Methode aufrufen musst, dann ist das wohl verschmerzbar.
__________________
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 13.05.2011, 09:42  
Neuer Benutzer
 
Registriert seit: 01.03.2011
Beiträge: 16
PHP-Kenntnisse:
Anfänger
Nico befindet sich auf einem aufstrebenden Ast
Standard

Es wird bei einer Hand voll Methoden bleiben.

Es geht um das Praktische ... auf der Gegenseite ist irgend ein .NET-WS ...

ich habe schon mehrere Artikel darüber gefunden das es Probleme macht und die entsprechenden "Lösungen" ... 2 Tage und nichts bei rausgekommen.

VS

Ein paar Stunden etwas selbst gestriktes. Neue WS-Methoden brauchen nur circa 10Minuten Aufwand bei der erstellung der Methode. (also nicht sehr viel länger als würde es mit der Soap-Extension genutzt werden)
Nico ist offline   Mit Zitat antworten
Alt 13.05.2011, 12:17  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Interoperabilität ist immer so eine Sache bei Webservices. 0815 Dienste sollten eigentlich immer gehen. Schwieriger wird es bei exotischen Sprachen oder z.B. WS* Implementierungen. Smalltalk generiert z.B. zusätzliche Elemente im WSDL, mit denen .NET nichts anfangen kann. Wobei IMHO .NET schon eine sehr gute Implementierung hat.

Was den Aufwand angeht: 10 Minuten vs. 0 Minuten je Methode summiert sich schon.. ´


Dein Problem hört sich doch nach dem hier an, oder? :
Zitat:
Trying to connect to a .NET webservice using the PHP SOAP client, we ran into much strangeness.

When using __soapCall do:
$params = array('a'=>$a, 'b'=>$b);
$result = $client->__soapCall('someFunction', array($params));

When using calling the function directly use:
$params = array('a'=>$a, 'b'=>$b);
$result = $client->someFunction($params);

If $params isn't associative, the client doesn't form the call correctly. Calling it other ways lead to having the first parameter dropped or the parameters not being displayed in the request.
Scheint, also die SOAP-Extension von PHP da ein Problem hat. Zumindest ist die generierte SOAP-Message ja schlicht falsch.
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat 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
[Erledigt] mysql_query() mit SQLDump princemichi PHP Einsteiger 4 07.03.2011 22:33
[Erledigt] Mehrere DIV Container mit einem Klick ändern (mit mehreren Request Aufrufe Lebenssonde JavaScript, Ajax und mehr 11 26.08.2010 09:01
xslt struktur.. so nur mit php-unterstützung möglich? Crypi PHP Tipps 2008 8 17.03.2008 17:58
neue id ermitteln oder mysql struktur ändern? Promaetheus PHP Tipps 2006 5 26.07.2006 18:15

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php \soap-env\ soapenv, php soapclient request manipulieren, mehrere soap anfragen, soapclient __dorequest, soap request php, aufbau soap request, soapclient::__dorequest, xsd_anyxml, php soap __dorequest, __dorequest net, php soap wsdl header neu setzen, soap client __dorequest problem, php soap client __dorequest beispiel, soap client anfrage struktur, soap php angekommen?, php soaprequest erstellen, soap 1 request oder mehrere, soap-env: auf soap: ändern, soap cleint für dumme, soapclient use __dorequest

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:50 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