Forum: Mikrocontroller und Digitale Elektronik Http Post Daten kommen nicht an


von Frederic B. (germinator)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Untersuche die tatsächlich gesendeten Daten in beiden Fällen mit 
Wireshark (o.ä.), damit Du den Unterschied herausfinden kannst.

von holger (Gast)


Lesenswert?

>ich versuche Daten in xml form vom µC an ein Php Script per Http-Post zu

Von welchem uC und welche Programmiersprache?

von Frederic B. (germinator)


Lesenswert?

Sainsmart Mega2560 mit dazugehörigem Ethernet Shield in C

Das mit Wireshark werd ich mal untersuchen, müsste ja eigentlich den 
fehler aufweisen, danke!

von holger (Gast)


Lesenswert?

>Sainsmart Mega2560 mit dazugehörigem Ethernet Shield in C

Dann schreib die Trigraphs richtig.
%x3C

Wobei du die meisten auch ganz normal schreiben kannst.
<Hallo> usw.

Bei " musst du aufpassen.

von holger (Gast)


Lesenswert?

>Untersuche die tatsächlich gesendeten Daten in beiden Fällen mit
>Wireshark

Über Uart senden dürfte einfacher sein.
Dann sieht er im Terminal den Schrott den er da zusammengebastelt hat.

von holger (Gast)


Lesenswert?

>%x3C

Mist jetzt hab ichs selber falsch gemacht;)

\x3C

von Frederic B. (germinator)


Lesenswert?

Sicher? Weil wenn ich das mit curl poste, dann funktioniert es ja mit 
den Trigraphs so wie ich sie verwendet habe .. wo würd ich eine Referenz 
dazu finden? Ich hab meine hier her:

http://www.w3schools.com/tags/ref_urlencode.asp

Die Quelle scheint mir doch recht vertraulich.

von holger (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Jobst M. (jobstens-de)


Lesenswert?

Was sagt denn
1
<? phpinfo(); ?>
auf dem Webserver, was ankommt?



Gruß

Jobst

von Läubi .. (laeubi) Benutzerseite


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.

von Frederic B. (germinator)


Lesenswert?

Ich glaubs nicht, es lag am Content-Type. Jetzt kommen die Daten an und 
werden in die Datenbank geschrieben. Besten Dank!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Frederic Branczyk schrieb:
> Ich glaubs nicht

Wieso nicht? So funktioniert nun mal das HTTP Protokoll ;-)

von Läubi .. (laeubi) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.