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
Hallo Micha
In meinem Gardena Modul verwende ich auch JSON Strings als Data. Ich kann Dir also sagen das es geht.
Grüße
Im Perl Beispiel unten hast du einen Header gesetzt. Hast du das auch beim Aufruf über httputils gemacht?
$req->header( 'Content-Type' => 'application/json' );
Vermutlich muss man den Inhalt vorher URL-Encoden mit urlEncode($json).
Danke für die ganzen Antworten, probiere ich heute Abend aus. Das mit dem Header setzen hatte ich auch mit httputils versucht.
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);
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.
Falls $data spezifiziert ist, dann ist method POST, will sagen, man koennte eine Zeile sparen.
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)