Http Post Daten kommen nicht an

OP #3061860
Lesenswert?
• ▲
▼
Hallo allerseits,

ich versuche Daten in xml form vom µC an ein Php Script per Http-Post zu 
schicken und in eine MySQL Datenbank zu schreiben.

Vom µC generierter String:
1
xml=%3C%3Fxml+version%3D%221%2E0%22+encoding%3D%22UTF%2D8%22+%3F%3E%3Csensors%3E%3Csensor%3E%3Caddress%3E000000000000A001%3C%2Faddress%3E%3Cvalue%3E0%2E00%3C%2Fvalue%3E%3C%2Fsensor%3E%3Csensor%3E%3Caddress%3E000000000000A002%3C%2Faddress%3E%3Cvalue%3E0%2E00%3C%2Fvalue%3E%3C%2Fsensor%3E%3C%2Fsensors%3E

Leserlich:
1
xml=<?xml version="1.0" encoding="UTF-8" ?>
2
<sensors>
3
  <sensor>
4
    <address>000000000000A001></address>
5
    <value>0.00</value></sensor>
6
  <sensor>
7
    <address>000000000000A002></address>
8
  <value>0.00</value></sensor>
9
</sensors>

mit

< entspricht %3C
> entspricht %3E
= entspricht %3D
? entspricht %3F
. entspricht %2E
- entspricht %2D
/ entspricht %2F
" entspricht %22
und leerzeichen entspricht +

wenn ich das nun per curl an das Php Script schicke funktioniert das 
tadellos und die Daten werden in die Datenbank geschrieben, wenn ich es 
aber mit dem µC schicke, sehe ich das zwar im access log vom Server, das 
"xml"-Element von $_POST ist jedoch leer.

Code für den Http-Post vom µC
1
client.println( "POST /insert_data.php HTTP/1.1" );
2
client.println( "Host: *website*" );
3
client.println( "Content-Type: application/xml" );
4
client.print( "Content-Length: " );
5
client.println( length );
6
client.println();
7
client.print( xml );

Was mache ich falsch?

Gruß
Frederic
Gast #3061949
Lesenswert?
• ▲
▼
>Dann schreib die Trigraphs richtig.

Auch nicht richtig, es sind die Escape Sequences.
Alzheimer lässt grüßen.

>Sicher? Weil wenn ich das mit curl poste, dann funktioniert es ja mit
>den Trigraphs so wie ich sie verwendet hab

C ist nicht curl.
Persönliche Seite #3061955
Lesenswert?
• ▲
▼
Um herauszufinden, ob die urlencode-Geschichte nur für curl erforderlich 
ist, oder auch für die vom µC versendeten Daten, ist wieder Wireshark 
ein probates Mittel.

Wenn der µC kein urlencode braucht, ist es natürlich völlig witzlos, mit 
\x20 und Co. zu arbeiten, da alle hier so codierten Zeichen /printable 
characters/ sind, d.h. auch einfach in ihrer Klartextfassung im String 
stehen können -- mit Ausnahme von Anführungszeichen, für die \" zu 
verwenden ist.
Persönliche Seite #3062213
Lesenswert?
• ▲
▼
Frederic Branczyk schrieb:
> Sicher? Weil wenn ich das mit curl poste, dann funktioniert es ja mit
> den Trigraphs so wie ich sie verwendet habe ..
Lass dich nicht verwirren! URL-Encode ist hier schon korrekt!

Rufus Τ. Firefly schrieb:
> Wenn der µC kein urlencode braucht

Würde mich doch stark wundern Die HTTP Lib hat nix an den Daten zu 
werkeln, es sei den es ist wirklich eine High-Level Implementierung, 
dann würde ich aber erwarten, das diese auch alle Header korrekt setz. 
Das URL-Encode wird definitiv benötigt wenn man auf Serverseite kein 
spezielles Handling vorsieht. Allerdings sollte man das dem Server 
auch mitteilen mittels
1
Content-type: application/x-www-form-urlencoded
 und nicht behaupten die Daten seien application/xml...

Das kann man sich übrigens sehr schön ansehen mit FireBug oder den IE 
Entwicklertools indem man einfach ein Simples HTML Formular baut. Oder 
einfach bei curl "spicken": 
http://stackoverflow.com/questions/866946/how-can-i-see-the-request-headers-made-by-curl-when-sending-a-request-to-the-ser

Also einfach mal probieren
1
client.println( "POST /insert_data.php HTTP/1.1" );
2
client.println( "Host: *website*" );
3
client.println( "Content-Type: application/x-www-form-urlencoded" );
4
client.print( "Content-Length: " );
5
client.println( length );
6
client.println();
7
client.print( xml );
Ich gehe davon aus, dass für den Host auch ein korrekter Wert drinnen 
steht.

Frederic Branczyk schrieb:
> sehe ich das zwar im access log vom Server
Falls das ein lokaler Server ist, oder du passende Rechte hast, ist auch 
ein blick ins Errorlog häufig erhellend.
Persönliche Seite #3063880
Lesenswert?
• ▲
▼
Du könntest übrigens dein XML auch als application/xml senden, müßtest 
auf Serverseite dann aber auf die Rohdaten zugreifen:
http://www.php.net/manual/de/reserved.variables.httprawpostdata.php
und anhand der Header prüfen ob es sich um xml daten oder "normale" POST 
Daten handelt welche von einem Formular kommen.

Dann entfällt zumindest das encodieren auf dem uC.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.