# cURL problem....

**URL:** <https://forum.shopware.com/t/curl-problem/2749>\
**Category:** Shopware 3.5\
**Tags:** programming\
**Created:** [11. Mai 2011 um 14:21 UTC](https://forum.shopware.com/t/curl-problem/2749 "2011-05-11T14:21:14Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![avenger](https://avatars.discourse-cdn.com/v4/letter/a/9de0a6/32.png) [@avenger](https://forum.shopware.com/u/avenger)\
**Post date:** [11. Mai 2011 um 14:21 UTC](https://forum.shopware.com/t/curl-problem/2749/1 "2011-05-11T14:21:14Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![Stefan\_Hamann](https://avatars.discourse-cdn.com/v4/letter/s/5e9695/32.png) [@Stefan\_Hamann](https://forum.shopware.com/u/Stefan_Hamann)\
**Post date:** [11. Mai 2011 um 14:49 UTC](https://forum.shopware.com/t/curl-problem/2749/2 "2011-05-11T14:49:51Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![avenger](https://avatars.discourse-cdn.com/v4/letter/a/9de0a6/32.png) [@avenger](https://forum.shopware.com/u/avenger)\
**Post date:** [11. Mai 2011 um 15:32 UTC](https://forum.shopware.com/t/curl-problem/2749/3 "2011-05-11T15:32:31Z")

</div>

> [@Stefan Hamann](#):
>
> Was für Informationen liefert der Request denn zurück?

413 Request Entity Too Large # Request Entity Too Large The requested resource /stock\_v1/atde/content.php does not allow request data with POST requests, or the amount of data provided in the request exceeds the capacity limit. \* \* \* Apache/2.2.3 (Oracle) Server at de.ep-es.com Port 443

[/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?

---

<div class="post-metadata">

**Author:** ![Stefan\_Hamann](https://avatars.discourse-cdn.com/v4/letter/s/5e9695/32.png) [@Stefan\_Hamann](https://forum.shopware.com/u/Stefan_Hamann)\
**Post date:** [11. Mai 2011 um 16:13 UTC](https://forum.shopware.com/t/curl-problem/2749/4 "2011-05-11T16:13:12Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![avenger](https://avatars.discourse-cdn.com/v4/letter/a/9de0a6/32.png) [@avenger](https://forum.shopware.com/u/avenger)\
**Post date:** [11. Mai 2011 um 16:31 UTC](https://forum.shopware.com/t/curl-problem/2749/5 "2011-05-11T16:31:57Z")

</div>

[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…

---

<div class="post-metadata">

**Author:** ![Heiner\_Lohaus](https://avatars.discourse-cdn.com/v4/letter/h/b5a626/32.png) [@Heiner\_Lohaus](https://forum.shopware.com/u/Heiner_Lohaus)\
**Post date:** [11. Mai 2011 um 18:37 UTC](https://forum.shopware.com/t/curl-problem/2749/6 "2011-05-11T18:37:40Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![radox1](https://avatars.discourse-cdn.com/v4/letter/r/e19b73/32.png) [@radox1](https://forum.shopware.com/u/radox1)\
**Post date:** [11. Mai 2011 um 18:59 UTC](https://forum.shopware.com/t/curl-problem/2749/7 "2011-05-11T18:59:31Z")

</div>

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://stackoverflow.com/questions/3007253/send-post-xml-file-using-curl-command-line) [http://curl.haxx.se/docs/manpage.html](http://curl.haxx.se/docs/manpage.html) [http://www.codediesel.com/php/posting-xml-from-php/](http://www.codediesel.com/php/posting-xml-from-php/) (keines der Beispiele getestet)

---

<div class="post-metadata">

**Author:** ![avenger](https://avatars.discourse-cdn.com/v4/letter/a/9de0a6/32.png) [@avenger](https://forum.shopware.com/u/avenger)\
**Post date:** [12. Mai 2011 um 06:56 UTC](https://forum.shopware.com/t/curl-problem/2749/8 "2011-05-12T06:56:01Z")

</div>

[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://stackoverflow.com/questions/3007253/send-post-xml-file-using-curl-command-line) [http://curl.haxx.se/docs/manpage.html](http://curl.haxx.se/docs/manpage.html) [http://www.codediesel.com/php/posting-xml-from-php/](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/](http://www.codediesel.com/php/posting-xml-from-php/) sieht ja viel versprechend aus, werde ich gleich mal probieren…

---

<div class="post-metadata">

**Author:** ![avenger](https://avatars.discourse-cdn.com/v4/letter/a/9de0a6/32.png) [@avenger](https://forum.shopware.com/u/avenger)\
**Post date:** [12. Mai 2011 um 07:46 UTC](https://forum.shopware.com/t/curl-problem/2749/9 "2011-05-12T07:46:39Z")

</div>

[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://stackoverflow.com/questions/3007253/send-post-xml-file-using-curl-command-line) [http://curl.haxx.se/docs/manpage.html](http://curl.haxx.se/docs/manpage.html) [http://www.codediesel.com/php/posting-xml-from-php/](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/](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/](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…
