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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren