zanox Webservices mit built-in PHP SOAP-Klasse

realy

Aktives Mitglied
Hallo,

ich habe ein Problem mit den zanox Webservices. Ich möchte gerne einfach einmal eine simple Funktion benutzen. Leider schaffe ich es nicht, den Header mit dem Passwortticket korrekt zu setzen.

Mein aktuellster Versuch:
CODE <?php
try {
$server = "http://services.zanox.com/zdk/general/v1/general.asmx?wsdl";
$username = 'schnick';
$password = 'schnack';
$params = array( 'username' => $username, 'password' => $password);
$client = new soapclient($server, array('trace'=>true, "exceptions" => true));
$result = $client->__soapCall('Login', array('parameters' => $params));
$ticket = $result->LoginResult; //Bis hierhin klappts. Dass Ticket bekomme ich

$var->ticket=$ticket;
$sHeader = new soapHeader('https://services.zanox.com/zdk/prm', 'zanox', $var);
$result=$client->__soapCall('GetTicketExpirationDateTime', array(), NULL, $sHeader);
} catch(Exception $e) {
print "Request :<br>\n".$client->__getLastRequest();
}
?>

Es wird dabei der folgende Request abgesetzt:

CODE <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://services.zanox.com/zdk/general" xmlns:ns2="https://services.zanox.com/zdk/prm">
<SOAP-ENV:Header>
<ns2:zanox>
<ticket>--ticket--</ticket>
</ns2:zanox>
</SOAP-ENV:Header>
<SOAP-ENV:Body><ns1:GetTicketExpirationDateTime/></SOAP-ENV:Body></SOAP-ENV:Envelope>


Als Antwort bekomme ich "Please specifiy a zanox ticket in the SOAP header!
at Zanox.Web.Services.General.General.GetTicketExpirationDateTime()"

Laut zanox-Anleitung soll es wohl genau so aussehen:

CODE <zanox xmlns="https://services.zanox.com/zdk/general"><ticket>$ticket</ticket></zanox>


Die in der Anleitung verwendete nusoap-Bibliothek möchte ich eigentlich nicht nutzen und außerdem gibt es eh einen Namenskonflikt mit der nusoap-Bibliothek und der built-in SOAP-Klasse.

Hat also jemand eine Ahnung, wie ich den Request gestalten kann?

Liebe Grüße
realy
 
QUOTE
$sHeader = new soapHeader('https://services.zanox.com/zdk/prm', 'zanox', $var);


Hier ist der Fehler, schaue mal in der Doku nach


CODE
function get_ticket(){
global $SUPPLIER;
$server = "http://services.zanox.com/zdk/general/v1/general.asmx?wsdl";
$operation = "Login";
$params = array( 'username' => $SUPPLIER['Zanox']['USERNAME'], 'password' => $SUPPLIER['Zanox']['PASSWORT']);
$client = new nsoapclient($server, true);
$result = $client->call($operation, array('parameters' => $params));
$this->ticket = $result['LoginResult'];
}
function get_leads(){
global $URLS;
$timezone_offset = "+08:00";
$server = "https://services.zanox.com/zdk/prm/v1/statisticservice.asmx?WSDL";
$client = new nsoapclient($server, true);
$headers = '<zanox xmlns="https://services.zanox.com/zdk/prm"><ticket>'.$this->ticket.'</ticket></zanox>';
$from_datetime = strftime( "%Y-%m-%dT%H:%M:%S$timezone_offset", $URLS->end );
$to_datetime = strftime( "%Y-%m-%dT%H:%M:%S$timezone_offset", $URLS->now );
$operation = "GetChangedTransactions";
$params = array( 'from' => $from_datetime, 'to' => $to_datetime, 'type' => 'lead', 'status' => 'all');
$client-> setHeaders($headers);
$result = $client->call($operation, array('parameters' => $params));
$temp=$result['GetChangedTransactionsResult']['transaction'];
}
}


Das ist ein Auszug aus meiner Klasse. Ich habe mehre Portal auf die Webservices umgestellt mit automatischen holen von Werbemitteln etc.
Falls du fragen hast meine ICQ-Nummer 292913800.
Zanox ist da ein bisschen eigenwillig.

Gruß Daniel
 
Hi,

danke für Deine Antwort.
Aber was genau ist der Fehler, und wie mache ich es richtig? Das der Fehler irgendwo im Header liegt, ist mir klar, denn er erkennt das Ticket ja nicht.

Bei Deiner Lösung verwendest Du eine umbenannte nusoap-Klasse, oder?
Ich hatte eigentlich an die eingebaute PHP-SOAP-Bibliothek gedacht, weil ich denke, die ist schneller und ressourcensparender
smile.gif


 
Wenn Zanox das

QUOTE (realy @ Fr 22.06.2007, 18:55)<zanox xmlns="https://services.zanox.com/zdk/general"><ticket>$ticket</ticket></zanox>


will, dann heißt das, daß die Elemente zanox und ticket zu demselben Namespace https://services.zanox.com/zdk/general gehören müssen. Wie man den Namespace aber deklariert, das kann man innerhalb der Xml-Regeln ziemlich freizügig wählen.

Bei deiner Lösung


QUOTE (realy @ Fr 22.06.2007, 18:55)<ns2:zanox>
<ticket>--ticket--</ticket>
</ns2:zanox>


gehört dagegen das Element zanox zum Namespace https://services.zanox.com/zdk/prm (also zum falschen), das Element ticket gehört zum nicht definierten Standardnamespace (also auch der falsche Namespace). Folglich ist das Meckern zwingend notwendig, Du schickst etwas, das nicht verständlich ist und deshalb zurückgewiesen werden muß.

Folglich: Da Du oben


QUOTE (realy @ Fr 22.06.2007, 18:55)xmlns:ns1="https://services.zanox.com/zdk/general"


deklarierst, verwende unten


QUOTE (realy @ Fr 22.06.2007, 18:55)<ns1:zanox>
<ns1:ticket>--ticket--</ns1:ticket>
</ns1:zanox>


Wenn Du oben (das ist kein Witz!)


QUOTE (realy @ Fr 22.06.2007, 18:55)xmlns:bierpluster="https://services.zanox.com/zdk/general"


verwendest, dann ist unten


QUOTE (realy @ Fr 22.06.2007, 18:55)<bierpluster:zanox>
<bierpluster:ticket>--ticket--</bierpluster:ticket>
</bierpluster:zanox>


die korrekte Lösung. Das alles hat nichts mit irgendwelchen Zusatzdingen in der Wirtssprache zu tun, das sind bloß die Namespace-Regeln von Xml, die für den Xml-Dokumenttyp SOAP natürlich gültig sind.
 
Danke Jürgen,

die Regeln sind mir schon soweit klar. Ich dachte, ich hätte ein Verständnisproblem mit der PHP-SOAP-Bibliothek.

Richtig erkannt hast Du, daß ich den falschen Namespace verwendet habe. Das habe ich irgendwie übersehen und mich an anderen Dingen festgebissen.

Typischer Fall von betriebsblind.

Danke nochmal. Jetzt klappts.

Liebe Grüße
realy
 
Zurück
Oben