Hat zwar nur indirekt mit Shopware zu tun, aber da ja einige Profis hier sind, versuche ich mal mein Glück… Ich versuche mit cURL eine Online-Bestandsabfrage zu realisieren. Letzten Endes bedeutet das einen POST von XML-Daten an einen (passswortgeschützten) Server. Die Verbindung selbst scheint zu funktionieren, nur retourniert mit der Server nicht die erwarteten Informationen… Folgende Routine verwende ich für die Kommunikation: function httpsPost($Url, $strRequest,$logit=true) { if ($logit) { $fh=fopen(strtolower(ONLINE\_STOCK\_REQUEST\_PROVIDER).'-log.txt','a'); if ($fh) { $two\_newline=PHP\_EOL.PHP\_EOL; fwrite($fh,'\*\*\*\*\* '.date('d.m.Y, H:i:s').' Message sent to '.ONLINE\_STOCK\_REQUEST\_URL.$two\_newline); fwrite($fh,$strRequest.$two\_newline); } } // Initialisation $ch=curl\_init(); if ($ch) { // Set parameters $options = array( CURLOPT\_URL =\> $Url, CURLOPT\_RETURNTRANSFER =\> true, // return web page CURLOPT\_HEADER =\> false, // don't return headers CURLOPT\_FOLLOWLOCATION =\> true, // follow redirects CURLOPT\_ENCODING =\> "", // handle all encodings CURLOPT\_USERAGENT =\> "xxxxxxxxx", // who am i CURLOPT\_USERPWD =\> ONLINE\_STOCK\_REQUEST\_CREDENTIALS, //Login data CURLOPT\_AUTOREFERER =\> true, // set referer on redirect CURLOPT\_CONNECTTIMEOUT =\> 60, // timeout on connect CURLOPT\_TIMEOUT =\> 60, // timeout on response CURLOPT\_MAXREDIRS =\> 10, // stop after 10 redirects CURLOPT\_POST =\> 1, // i am sending post data CURLOPT\_POSTFIELDS =\> 'post\_data='.urlencode($strRequest), // this are my post vars CURLINFO\_CONTENT\_TYPE =\> 'text/text', CURLOPT\_SSL\_VERIFYHOST =\> 0, // don't verify ssl CURLOPT\_SSL\_VERIFYPEER =\> false, // CURLOPT\_VERBOSE =\> 1 // ); curl\_setopt\_array($ch,$options); // execute the connexion $response = curl\_exec($ch); // Close it // Check if any error occured if (curl\_errno($ch)) { if ($fh) { fwrite($fh,$two\_newline.'cURL error! ('.curl\_error ($ch).RPAREN.$two\_newline); } } else { $xfer\_info=''; $info = curl\_getinfo($ch); foreach ($info as $key=\>$val) { $xfer\_info.=PHP\_EOL.$key.EQUAL.$val; } if ($fh) { fwrite($fh,$two\_newline.'\*\*\* cURL transfer info'.$two\_newline); fwrite($fh,$xfer\_info.$two\_newline); } else { echo $xfer\_info; } } curl\_close($ch); } else { $res='Failed to establish communication to "'.ONLINE\_STOCK\_REQUEST\_PROVIDER.QUOTE.COLON\_BLANK.$errstr; if ($fh) { fwrite($fh,$two\_newline.$res.$two\_newline); } } if ($response) { if ($fh) { fwrite($fh,$two\_newline.'Answer received from remote service'.$two\_newline.$response.$two\_newline); fwrite($fh,str\_repeat('=',150).$two\_newline); } } if ($fh) { fclose($fh); } return $response; }
Ich habe mir mit “curl_getinfo” die Transfer-Statistiken anzeigen lassen: [quote]url=https://de.ep-es.com/stock_v1/atde/content.php content_type=text/html; charset=UTF-8 http_code=200 header_size=208 request_size=289 filetime=-1 ssl_verify_result=20 redirect_count=0 total_time=0.325 namelookup_time=0.001 connect_time=0.037 pretransfer_time=0.176 [color=red]size_upload=0[/color] size_download=103 speed_download=316 speed_upload=0 download_content_length=103 [color=red]upload_content_length=0[/color] starttransfer_time=0.325 redirect_time=0[/quote] Was dabei auffällt ist, dass sowohl “size_upload”, als auch “upload_content_length” den Wert 0 haben, anscheinend also keine Daten zum Server übertragen werden, obwohl in “$strRequest” definitiv Daten enthalten sind. Hat jemand eine Idee, was das Problem sein könnte?
Was für Informationen liefert der Request denn zurück? Ich würde das mit Zend_Http_Client lösen, das ist deutlich robuster und einfacher als der direkte Weg über Curl. Wenn es um ein Shopware Plugin geht, hättest du das ja sowieso out-of-the-box dabei.
[/quote] (Die Daten sind nur ca. 100 Byte lang.) Wobei der Serverbetreiber aber den POST-Zugriff spezifiziert… Allerdings ist die Doku in diesem Bereich sehr dürftig… Als LINUX Spezi sagt Dir das ja vielleicht was: curl -u user:password -k -H "Content-Type: text/text" -d @query.xml https://de.ep-es.com/stock\_v1/atde/content.php
(Das Format der „query.xml“ ist spezifiziert…) Das ist ein Beispiel für eine Bestandsabfrage (ich schätze mal über die Konsole… Voll cool! Und dann noch die Aussage, dass man das auch per POST machen könnte, ohne weiteren Hinweis.) Was wäre denn das HTTP-Äquivalent zu dieser Konsolen-Abfrage?
und wie sieht die query.xml vom Aufbau her aus? Irgendwo her muss er ja noch wissen, wie der Post-Parameter heißt, den er übermitteln soll?
[quote=“Stefan Hamann”]und wie sieht die query.xml vom Aufbau her aus? Irgendwo her muss er ja noch wissen, wie der Post-Parameter heißt, den er übermitteln soll?[/quote] Genau das habe ich auch vermisst… Die query.xml ist reines xml… Aber das Grundproblem ist ja erst mal, dass der Server gar keinen POST-Request akzeptieren will… Deshalb auch mein Frage, was bei diesem Konsolen-Kommando eigentlich geschieht…
Hi, vielleicht darfst du auch einfach kein Post-Parameter angeben? CURLOPT\_POSTFIELDS =\> /\*'post\_data='.\*/urlencode($strRequest),
Bei Xml-Rpc-Schnittstellen werden die Daten auch so übergeben. In PHP können dann die Daten dann so ausgelesen werden: $postdata = file\_get\_contents("php://input");
Viele Grüße Heiner
Hallo, so wie’s ausschaut wird hier einfach der Inhalt einer XML-Datei per POST an den Server gesendet und eine Rückgabe als Text erwartet. http://stackoverflow.com/questions/3007 … mmand-line http://curl.haxx.se/docs/manpage.html http://www.codediesel.com/php/posting-xml-from-php/ (keines der Beispiele getestet)
[quote=„radox“]Hallo, so wie’s ausschaut wird hier einfach der Inhalt einer XML-Datei per POST an den Server gesendet und eine Rückgabe als Text erwartet. http://stackoverflow.com/questions/3007 … mmand-line http://curl.haxx.se/docs/manpage.html http://www.codediesel.com/php/posting-xml-from-php/ (keines der Beispiele getestet)[/quote] Danke für die Info, so langsam beginne ich, das Ganze zu verstehen… Das Beispiel in http://www.codediesel.com/php/posting-xml-from-php/ sieht ja viel versprechend aus, werde ich gleich mal probieren…
[quote=„avenger“][quote=„radox“]Hallo, so wie’s ausschaut wird hier einfach der Inhalt einer XML-Datei per POST an den Server gesendet und eine Rückgabe als Text erwartet. http://stackoverflow.com/questions/3007 … mmand-line http://curl.haxx.se/docs/manpage.html http://www.codediesel.com/php/posting-xml-from-php/ (keines der Beispiele getestet)[/quote] Danke für die Info, so langsam beginne ich, das Ganze zu verstehen… Das Beispiel in http://www.codediesel.com/php/posting-xml-from-php/ sieht ja viel versprechend aus, werde ich gleich mal probieren…[/quote] HEUREKA! Es funktioniert! Das Beispiel in http://www.codediesel.com/php/posting-xml-from-php/ hat nicht funktioniert, der Server hat das schnöde als „unverständlichen Request“ zurückgewiesen. Aber zumindest hatte ich jetzt ein paar neue Keywords zum „googeln“, und aus mehreren Informationen habe ich mir dann folgende Routine zusammengebaut (braucht natürlich noch ein vernünftiges Fehlerhandling und Logging): function httpsPost($Url, $strRequest,$logit=true) { $ch = curl\_init(); curl\_setopt($ch, CURLOPT\_URL, $Url); curl\_setopt($ch, CURLOPT\_USERPWD, ONLINE\_STOCK\_REQUEST\_CREDENTIALS); curl\_setopt($ch, CURLOPT\_SSL\_VERIFYHOST, false); curl\_setopt($ch, CURLOPT\_SSL\_VERIFYPEER, false); curl\_setopt($ch, CURLOPT\_POST, true); curl\_setopt($ch, CURLOPT\_HTTPHEADER, array('Content-Type: text/xml')); curl\_setopt($ch, CURLOPT\_POSTFIELDS, $strRequest); curl\_setopt($ch, CURLOPT\_RETURNTRANSFER, true); $response = curl\_exec($ch); return $response; }
$strRequest sieht so aus: <?xml version="1.0"?><bestandsabfrage><artikel><artnr>689315</artnr></artikel></bestandsabfrage>
,enthält also das reine XML… (Mit einem abschließenden ‚‘ verweigerte der Server übrigens die Antwort…) Der Server antwortet darauf mit: <?xml version="1.0"?><bestaende>
<bestaende>
<artikel artnr="689315">
<bestand lagernr="114">3</bestand>
</artikel>
</bestaende>
<messages>
</messages>
</bestaende>
, also genau dem, was ich brauche… Dank an alle, die sich die Zeit genommen habe, über das Problem nachzudenken, und Hinweise zu geben. Ich wusste doch, dass meine Einschätzung der Qualität des Forums richtig ist! Das ist übrigens eine Bestandsabfrage des Servers von „Electronic Partners“ (die auch als „Drop-Shipment“-Provider agieren), falls das mal jemand braucht…