2015-10-13 2 views
8

Ich schreibe einen PHP-Wrapper für einen SOAP-Service und verwende die Class-Map-Option, damit ich mit Objekten statt mit Arrays arbeiten kann. Das funktioniert großartig, bis der Provider des SOAP-Dienstes beschließt, einem seiner Objekte eine neue Eigenschaft hinzuzufügen (die sie gerne tun, ohne es jemandem mitzuteilen), zu welchem ​​Zeitpunkt der SOAP-Client mit dem Fehler SOAP-ERROR: Encoding: object has no 'NewlyAddedProperty' property bricht, da es jetzt eine Eigenschaft in der wsdl das ist nicht in der Klasse.SOAP-Clients fehlertoleranter machen, wenn Klassenzuordnung verwendet wird

Ich habe versucht, es zu umgehen, indem Sie einen magischen Getter und Rückgabe von Dingen wie false, null etc, aber da sie keine gültigen Werte gemäß der WSDL sind, es immer noch einen schwerwiegenden Fehler wirft.

In einer idealen Welt würde der Client diese neue Eigenschaft nur auf das Objekt setzen, auch wenn keine Eigenschaft für die Klasse definiert ist, ist das möglich? Es wäre auch gut, den Fehler nicht einfach zu unterdrücken.

+1

Die Karte Klasse sollte die SOAP-Codierung Fehler nicht verursachen. Mögliche Ursache könnte WSDL im Cache sein - versuchen Sie, den WSDL-Cache zu leeren, holen Sie neue WSDL vom Provider und sehen Sie, ob das Problem weiterhin besteht. – jpaljasma

+0

, die es leider nicht beheben, scheint das Problem zu sein, dass die WSDL bestimmte Werte für den neuen Feldtyp erfordert. Wenn das Feld fehlt, wird standardmäßig "' "angezeigt, was keine gültige Option ist. – pogo

+0

__get() magische Methode wird nicht helfen, weil SOAP keine Variablen fragt, sondern var_export() oder ähnliches (interne Funktion) verwendet. Und dieses Problem ist nicht mit PHP - Sie würden die gleiche Situation mit Java bekommen. Die einzige Möglichkeit besteht darin, konkrete Regeln zum Auslösen eines Fehlers einzurichten, die Sie benachrichtigen, wenn sich WSDL ändert, damit Sie Ihre Klassen anpassen und den fehlenden Parameter hinzufügen können. – jpaljasma

Antwort

1

SOAP bedeutet XML über HTTP - der Besitzer des SOAP-Dienstes kann und sollte nicht alle Systeme kennen, die ihn aufrufen.

Diese Sprödigkeit ist in die SOAP-Schnittstelle integriert. Der Dienst sollte eingehende Anforderungen anhand seines Schemas überprüfen. Es wird fehlschlagen, es sei denn, sie machen diesen Pfad optional. Es ist keine "Enteneingabe" eingebaut.

2

Sie können die Klassenzuordnung SoapClient entfernen und eine andere verwenden, z. B. jsonmapper.

Wenn Ihre Klassen korrekt kommentiert werden, dann ist es so einfach, wie dieses Beispiel:

class noBisnodePersonClient extends SoapClient { 

    // ... 

    /** 
    * sokPerson 
    * @param noBisnodePersonSok $PersonSokReq 
    * @return noBisnodePersonSokResponse 
    */ 
    public function sokPerson(noBisnodePersonSok $PersonSokReq){ 
     $return = $this->__soapCall(
      'sokPerson', 
      array($PersonSokReq), 
      array('uri'=>'http://dbonline.no/webservices/wsdl/PersonInfo') 
     ); 
     $mapper = new JsonMapper(); 
     $object = $mapper->map($return, new noBisnodePersonSokResponse); 
     return $object; 
    } 
} 
+0

Gibt es eine andere Option? Ich würde lieber nicht eine Menge Code neu schreiben, es sei denn, es ist absolut notwendig. – pogo

+0

Ich habe ein Beispiel hinzugefügt, das zeigt, dass es nicht so schwierig ist. Sie können sogar '__soapCall()' erweitern, um den 6. Parameter hinzuzufügen, die zurückgegeben werden soll. – Marek

Verwandte Themen