Forum: PC-Programmierung Einfaches Skript, das Daten an den Server sendet


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mehdi J. (Firma: SAS) (omegaprimus)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte die Daten in "a" und "D" nach einem Server schicken.
#!/bin/bash
for i in {1..10}
do
a=$(date '+%s')
D=$(sensors)


curl -i -k -X POST -H "Content-Type: application/json" --data '{ "id":2,"timestamp": "'"${a}"'","data": "'"${D}"'"}' https://dv7knsjzph.execute-api.eu-central-1.amazonaws.com/prod/boxtronic-devices/2/data/

sleep 1
done

Ich bekomme aber immer eine Fehlermeldung.
HTTP/1.1 502 Bad Gateway
Date: Tue, 10 Nov 2020 12:59:20 GMT
Content-Type: application/json
Content-Length: 36
Connection: keep-alive
x-amzn-RequestId: c00ef469-5d28-4c11-8740-a2125e1d5256
x-amzn-ErrorType: InternalServerErrorException
x-amz-apigw-id: Vys6XGiIFiAFqaA=

{"message": "Internal server error"}HTTP/1.1 502 Bad Gateway


Mit normaler Syntaxe ohne Daten habe ich kein Problem:
curl -i -k -X POST -H "Content-Type: application/json" --data '{ "id":"id","timestamp":"data","data":"data"}' https://dv7knsjzph.execute-api.eu-central-1.amazonaws.com/prod/boxtronic-devices/2/data/

von Εrnst B. (ernst)


Bewertung
0 lesenswert
nicht lesenswert
Json erlaubt keine Newlines in Strings, du wirst im "$D" also \n durch 
\\n ersetzen müssen.


Bei vorhandenem gnu-sed:
D=$(sensors | sed -z 's/\n/\\n/g')

: Bearbeitet durch User
von DPA (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Um json zu erstellen, zusammenzubauen oder anzerweitig 
weiterzuverarbeiten, würde ich jq nehmen: 
https://stackoverflow.com/questions/51953147/insert-an-html-file-into-a-json-file-value-using-jq

Da hat man dann keine Probleme mit escaping.

von Imonbln (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ist es diesmal wenigsten stabile ein 502 Fehler, im letzten Post hast du 
noch ziemlich mit allen möglichen Fehlern bei Curl zu Kampfen gehabt?

Mehdi J. schrieb:
> HTTP/1.1 502 Bad Gateway

5xx – Server-Fehler : Die Ursache des Scheiterns der Anfrage liegt eher 
im Verantwortungsbereich des Servers.

502 – Bad Gateway: Der Server konnte seine Funktion als Gateway oder 
Proxy nicht erfüllen, weil er seinerseits eine ungültige Antwort 
erhalten hat.

Spreche also mal mit einen Kollegen der den Server aufgesetzt hat. Seht 
dort im Log nach was der Server mit den Request gemacht hat und versucht 
wenn nötig das Loglevel auf Debug anzuheben.

der Request könnte sogar Korrekt sein, aber Ohne internes Wissen, was 
euer Endpoint braucht ist das Raten.

Εrnst B. schrieb:
> Json erlaubt keine Newlines in Strings, du wirst im "$D" also \n durch
> \\n ersetzen müssen.

Das Kommt Drauf an (TM), in JSON selbst ist es verboten, aber dennoch 
kenne ich genügend Implementierungen, den das egal ist.

von Εrnst B. (ernst)


Bewertung
0 lesenswert
nicht lesenswert
Imonbln schrieb:
> Das Kommt Drauf an (TM), in JSON selbst ist es verboten, aber dennoch
> kenne ich genügend Implementierungen, den das egal ist.

Der TE meinte dass sein curl-aufruf mit statischem Daten-String (und 
dadurch güligem JSON) funktioniert, und der einzige Unterschied zu 
seinem dynamischem curl-Aufruf ist, dass dort die Strings länger sind 
und Newlines enthalten (==> ungültiges JSON)

Insofern würde ich schon davon ausgehen, dass das Teil des Problems ist.

Unabhängig davon: Ist ja auch nicht schön, hier wissentlich invalide 
Daten zu senden, nur in der Hoffnung dass der Empfänger sich das schon 
irgendwie zurechtwurschteln kann.

Ob das ganze dann auf der Applikationsebene auch noch tut, also seine 
Sensor-Werte irgendwie sinnvoll in einer Datenbank landen o.Ä., ist 
danach eine andere Geschichte.

von 8n1 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ersetz mal curl mit echo und schau dir an wie das ganze aussieht.

von binbash (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mehdi J. schrieb:
> Mit normaler Syntaxe ohne Daten habe ich kein Problem:
>
>
> curl -i -k -X POST -H "Content-Type: application/json" --data '{ 
> "id":"id","timestamp":"data","data":"data"}' 
> https://dv7knsjzph.execute-api.eu-central-1.amazonaws.com/prod/boxtronic-devices/2/data/
> 


debugbar mit trace o. trace-ascii nach stdout -

curl trace-ascii - -i -k -X POST -H ......


...
...
=> Send data, 36 bytes (0x24)
0000: { "id":2,"timestamp": "","data": ""}
== Info: We are completely uploaded and fine
<= Recv SSL data, 5 bytes (0x5)
0000: ....!
<= Recv SSL data, 5 bytes (0x5)
0000: .....
<= Recv header, 13 bytes (0xd)
0000: HTTP/2 502
...


---
Data is hier nat. null.

von binbash (Gast)


Bewertung
0 lesenswert
nicht lesenswert
oups:

curl --trace - ....
curl --trace-ascii - ....

curl --trace-ascii -      -i -k -X POST -H ......

von Sheeva P. (sheevaplug)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Mehdi J. schrieb:
> ich möchte die Daten in "a" und "D" nach einem Server schicken.
> [...]
> Ich bekomme aber immer eine Fehlermeldung.

Da Du so freundlich warst, die reale URL zu posten (räusper), war ich 
mal so freundlich, ein bisschen herumzuspielen -- und ich glaube, ich 
habe den Fehler gefunden: Der Server erwartet den "timestamp" als 
Datentyp String und nicht als Integer oder Float.

Weil ich zu faul (und meist auch zu blöd) bin, mir sowas inklusive 
Quoting und dem ganzen anderen Hantier als Shellskript zu basteln, hab' 
ich mir ein kleines Python-Skriptlein dafür geschrieben, das Du und 
andere Interessierte im Anhang finden.

Ja, mein Skriptlein hat ein paar mehr Zeilen als Dein Shellskript, aber 
dafür ist ein (mehr oder weniger) sauberes Logging und Exception 
Handling eingebaut. Natürlich muß es auch nicht auf STDOUT, sondern kann 
auch in eine Datei, ins (r)syslog und / oder das Journal auf 
systemd-basierten Systemen loggen (think monitoring, central logging, 
...) . Mein Logformat ist deswegen so, weil ich faul bin und die Ausgabe 
mit csvlook (aus dem csvkit [1]) und less(1) anschauen wollte.

Ich hab' versucht, möglichst ausführlich zu dokumentieren, was das Ding 
tut. Wer Fragen dazu hat, ist natürlich trotzdem immer herzlich 
willkommen. ;-)

---8<--
*Dies ist für Leute, die das Skriptchen womöglich ausprobieren wollen.*

Wer dieses Skript ausführen möchte, braucht mindestens: ein System, 
unter dem das Programm sensors(1) verfügbar ist und auf dem vor dem 
Aufruf meines Skriptleins das Programm sensors-detect(8) aufgerufen 
wurde. Die beiden Programme finden sich (zumindest unter 
Debian-basierten Linux-Distributionen) im Paket "lm-sensors".

Dann benutze ich -- Faulheit ist nach Larry Wall, dem Erfinder von Perl, 
eine der Kardinaltugenden von guten Entwicklern -- ein Package, das 
nicht in der Standard-Bibliothek von Python enthalten ist, nämlich das 
Paket "requests". In der mit [2] verlinkten Dokumentation gibt es einen 
Link "Installation"...

Auf meinen Systemen arbeite ich allerdings immer mit virtualenv und seit 
ein paar Jahren mit Python in der Version 3. Wer dazu Fragen hat, ist 
herzlich willkommen.
--->8--


[1] https://csvkit.readthedocs.io/en/latest/
[2] https://requests.readthedocs.io/de/latest/

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.