[gelöst] httputils

Begonnen von michael.winkler, 01 Januar 2018, 23:31:54

Vorheriges Thema - Nächstes Thema

michael.winkler

Hallo,

ich versuche aktuell einen JSON String via HttpUtils_NonblockingGet zu senden. Leider funktionierte das bei mir nicht. Dem Parameter "data" habe ich mit dem entsprechenden Wert gefüllt z.b.

{"command": "disconnect"}


den Type habe ich auf "POST" gestellt. Leider führt die Webseite nicht den Befehl aus, sondern meldet mir dass der JSON String noch fehlt.

Wenn ich das Gleich über folgende Perl Routine mache, wird der entsprechende Befehl auf der Webseite ausgeführt. Allerdings wird dann FHEM solange blockiert.


use LWP::UserAgent;
my $json = '{"command": "disconnect"}';
my $req  = HTTP::Request->new( 'POST', $uri );
$req->header( 'Content-Type' => 'application/json' );
$req->content( $json );
my $lwp = LWP::UserAgent->new;
$lwp->timeout(1);
my $res = $lwp->request( $req );


Jetzt zu meiner Frage. Kann Httputils das aktuell gar nicht, oder habe ich da noch einen Denkfefehler?

Gruß
Michael

CoolTux

Hallo Micha

In meinem Gardena Modul verwende ich auch JSON Strings als Data. Ich kann Dir also sagen das es geht.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

mumpitzstuff

Im Perl Beispiel unten hast du einen Header gesetzt. Hast du das auch beim Aufruf über httputils gemacht?

$req->header( 'Content-Type' => 'application/json' );

rudolfkoenig

Vermutlich muss man den Inhalt vorher URL-Encoden mit urlEncode($json).

michael.winkler

Danke für die ganzen Antworten, probiere ich heute Abend aus. Das mit dem Header setzen hatte ich auch mit httputils versucht.

betateilchen

#5
Zitat von: michael.winkler am 01 Januar 2018, 23:31:54
Jetzt zu meiner Frage. Kann Httputils das aktuell gar nicht,

Das kann HttpUtils definitiv, denn ich schicke damit json-Daten in die SAP Cloud.


   my $timestamp = time();
   my $body      = '{"mode":"async", "messageType":"';
      $body     .= $message_type_id_event;
      $body     .= '", "messages":[{"timestamp": "'.$timestamp.'", "fhemTemp": "'.$event.'" }]}';

   my %hu_hash = ();
   $hu_hash{url}      = $url;
   $hu_hash{timeout}  = 5;
   $hu_hash{header}   = "User-Agent: None\r\nContent-Type: application/json;charset=utf-8\r\nAuthorization: Bearer $oauth_credentials_for_device";
   $hu_hash{method}   = "POST";
   $hu_hash{data}     = $body;
   $hu_hash{callback} = sub($$$) { return undef };

   HttpUtils_NonblockingGet(\%hu_hash);

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

michael.winkler

Zitat von: betateilchen am 02 Januar 2018, 17:48:02
Das kann HttpUtils definitiv, denn ich schicke damit json-Daten in die SAP Cloud.


   my $timestamp = time();
   my $body      = '{"mode":"async", "messageType":"';
      $body     .= $message_type_id_event;
      $body     .= '", "messages":[{"timestamp": "'.$timestamp.'", "fhemTemp": "'.$event.'" }]}';

   my %hu_hash = ();
   $hu_hash{url}      = $url;
   $hu_hash{timeout}  = 5;
   $hu_hash{header}   = "User-Agent: None\r\nContent-Type: application/json;charset=utf-8\r\nAuthorization: Bearer $oauth_credentials_for_device";
   $hu_hash{method}   = "POST";
   $hu_hash{data}     = $body;
   $hu_hash{callback} = sub($$$) { return undef };

   HttpUtils_NonblockingGet(\%hu_hash);



Danke Jungs, jetzt funktioniert es bei mir. Ich denke dass der Header bei mir nicht gestimmt hat. Nachdem ich den Header von Dir übernommen habe, hat es sofort funktionier.

rudolfkoenig

Falls $data spezifiziert ist, dann ist method POST, will sagen, man koennte eine Zeile sparen.

betateilchen

das ist richtig, aber mit dieser zusätzlichen Zeile kann ich den Code auch noch in zwei Jahren verstehen, falls ich dann gerade nicht daran denke, dass die Methodenauswahl automatisch von einer anderen Variablen abhängt  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!