Komplexer Typ in PHP NuSoap

Ich baue einen Webservice mit der NuSoap-Bibliothek in PHP. Mein Webservice wird als Mittelschicht zwischen dem Kunden und einem bereits bestehenden Webservice eines Anbieters fungieren. Anstatt sich direkt mit dem Anbieter zu verbinden, werden sie sich mit meinem Web-Service verbinden, mein Web-Service verbindet sich mit dem Anbieter und holt sich die Antwort und sendet die gleiche Antwort zurück an den Client.

Mein einziges Problem ist, dass mein Anbieter das Objekt stdclass zurücksendet (sein Webservice ist in .Net geschrieben), und ich muss dieses Objekt erhalten und dasselbe Objekt an den Client über meine Webservice-Methode zurücksenden.

Ich habe ziemlich viel im Internet gesucht, aber es gibt keine klaren Wege, dies durch die NuSoap-Bibliothek zu erreichen. Was immer ich bisher gelesen habe, gebe an, dass ich einen komplexen Typ verwenden muss, um dies zu erreichen, aber ich habe keine Ahnung, wie ich die Antwort erfassen und dann in den komplexen Typ konvertieren und an den Client zurücksenden soll.

Vielen Dank im Voraus für Ihre Hilfe.

0

1 Antworten

Was Sie schreiben, wird als Proxy bezeichnet.

Es gibt einige Beispiele , die online für den NuSoap-Server gesendet werden, um komplexe Typen über das Internet zu senden addComplexType -Methode.

//Create a complex type
$server->wsdl->addComplexType('MyComplexType','complexType','struct','all','',
array( 'ID' => array('name' => 'ID','type' => 'xsd:int'),
'YourName' => array('name' => 'YourName','type' => 'xsd:string')));

Eine Möglichkeit, den Proxy zu implementieren, besteht darin, den Dienst mit ausgedruckten Daten zu erstellen, sodass er nicht zuerst mit dem Back-End-Dienst kommuniziert. Sehen Sie, ob Sie den ursprünglichen Client mit einer erfundenen Antwort von Ihrem Proxy zufriedenstellen können. Dann, sobald Sie das haben, sollte der Konsum des echten Backend-Dienstes trivial sein (SOAP-Client-Operationen sind einfacher als Server nach meiner Erfahrung).

Eine andere Alternative ist die native SoapServer Klasse. Der erste Kommentar hier zeigt, wie man einen komplexen Typ erstellt.

BEARBEITEN

Nachdem Sie sich ein wenig mehr umgeschaut haben, ist hier ein viel besseres Beispiel .

Es gibt zwei Möglichkeiten, einen komplexen Typ mit NuSoap zu registrieren, und zwar über den Docblock unter addComplextType (lib/class.wsdl.php)

/**  
* adds an xml Schema complex type to the WSDL types
*
* @param string $name
* @param string $typeClass (complexType|simpleType|attribute)
* @param string $phpType currently supported are array and struct (php assoc array)
* @param string $compositor (all|sequence|choice)
* @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
* @param array $elements e.g. array ( name => array(name=>'',type=>'') )
* @param array $attrs e.g. array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]'))
* @param string $arrayType as namespace:name (xsd:string)
* @see nusoap_xmlschema
* @access public
*/

Sehen Sie, wie er es in dem späteren Beispiel tut, das ich gepostet habe:

$server->wsdl->addComplexType('Contact',
    'complexType',
    'struct',
    'all',
    '',
    array(
            'id' => array('name' => 'id', 'type' => 'xsd:int'),
            'first_name' => array('name' => 'first_name', 'type' => 'xsd:string'),
            'last_name' => array('name' => 'last_name', 'type' => 'xsd:string'),
            'email' => array('name' => 'email', 'type' => 'xsd:string'),
            'phone_number' => array('name' => 'phone_number', 'type' => 'xsd:string')
    )
);

Dann wie die Antwort mit dem Kontakt -Komplextyp zurückgegeben wird:

function updateContact($in_contact) {
    $contact = new Contact($in_contact['id']);
    $contact->first_name=mysql_real_escape_string($in_contact['first_name']);
    $contact->last_name=mysql_real_escape_string($in_contact['last_name']);
    $contact->email=mysql_real_escape_string($in_contact['email']);
    $contact->phone_number=mysql_real_escape_string($in_contact['phone_number']);
    if ($contact->update()) return true;
}

In seinem Beispiel sehen Sie auch, wie Sie die Array-Variante verwenden. Entschuldigung für die große Antwort!

0
hinzugefügt
Vielen Dank für die Antwort bezüglich der Stubbed-Daten, wir möchten immer die letzte Antwort vom Server zurücksenden, was bedeutet, dass selbst wenn die API des Anbieters geändert wurde oder eine andere Ausgabe zurückgibt, unsere API dieselbe Realtime widerspiegeln sollte. In dieser Situation könnten also Stubbed-Daten schwierig zu verwenden sein. Kommen wir zu dem Complextype-Beispiel für nusoap: Muss ich das vom Server kommende Objekt analysieren und dann im Array neu zuweisen, um einen komplexen Typ zu erstellen? Kann ich auch einen ComplexType innerhalb einer Methode in meiner API erstell
hinzugefügt der Autor Ricky, Quelle
Ah, das könnte ein bisschen schmerzhaft sein, aber ich höre Sie auf den Stubbed-Daten. Für den komplexen Typ möchten Sie den komplexen Typ registrieren. In der Methode, die die Anforderung verarbeitet ( updateContact im zweiten Beispiel oben), sendet der Client einen soapclient um eine Verbindung zum Back-End-Dienst herzustellen. Analysieren Sie die Antwort daraus, erstellen Sie das Objekt oder Array (basierend auf der struct - oder -Array -Option in addComplexType und geben Sie diese dann vom Handler zurück.
hinzugefügt der Autor quickshiftin, Quelle
PHP - Deutsche Gemeinschaft
PHP - Deutsche Gemeinschaft
5 der Teilnehmer

In dieser Gruppe sprechen wir über PHP. Partner: de.switch-case.com