FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: michael.winkler am 01 Januar 2018, 23:31:54

Titel: [gelöst] httputils
Beitrag von: michael.winkler am 01 Januar 2018, 23:31:54
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
Titel: Antw:httputils
Beitrag von: CoolTux am 02 Januar 2018, 06:48:23
Hallo Micha

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


Grüße
Titel: Antw:httputils
Beitrag von: mumpitzstuff am 02 Januar 2018, 08:47:03
Im Perl Beispiel unten hast du einen Header gesetzt. Hast du das auch beim Aufruf über httputils gemacht?

$req->header( 'Content-Type' => 'application/json' );
Titel: Antw:httputils
Beitrag von: rudolfkoenig am 02 Januar 2018, 10:12:17
Vermutlich muss man den Inhalt vorher URL-Encoden mit urlEncode($json).
Titel: Antw:httputils
Beitrag von: michael.winkler am 02 Januar 2018, 10:42:53
Danke für die ganzen Antworten, probiere ich heute Abend aus. Das mit dem Header setzen hatte ich auch mit httputils versucht.
Titel: Antw:httputils
Beitrag von: betateilchen am 02 Januar 2018, 17:48:02
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);

Titel: Antw:httputils
Beitrag von: michael.winkler am 02 Januar 2018, 18:11:24
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.
Titel: Antw:[gelöst] httputils
Beitrag von: rudolfkoenig am 02 Januar 2018, 18:28:38
Falls $data spezifiziert ist, dann ist method POST, will sagen, man koennte eine Zeile sparen.
Titel: Antw:[gelöst] httputils
Beitrag von: betateilchen am 02 Januar 2018, 18:41:44
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)