FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Guenni1404 am 29 August 2021, 22:23:30

Titel: API POST mit HTTPMOD ansprechen
Beitrag von: Guenni1404 am 29 August 2021, 22:23:30
Hallo,

ich versuche an eine API per HTTPMOD Daten zu senden.
Die API kann ich er CURL ansprechen
curl -X 'POST' \
  'https://demo.grocy.info/api/chores/1/execute' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "tracked_time": "2021-08-29T19:41:39.824Z",
  "done_by": 0
}'


Kann mir vielleicht jemand sagen, wie ich das mit HTTPMOD machen kann?

Gruß

guenni
Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: betateilchen am 30 August 2021, 12:06:45
Man muss nicht jeden URL-Aufruf mit HTTPMOD machen, oft reichen dafür viel einfachere in FHEM vorhandene Lösungen, zum Beispiel GetFileFromURL() oder HttpUtils_NonblockingGet()

Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: Guenni1404 am 30 August 2021, 21:42:31
Danke,
schaue ich mir mal an. Wenn Fragen sind melde ich mich.
Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: Guenni1404 am 30 August 2021, 22:02:17
Ich habe mir mal GetFileFromURL() oder HttpUtils_NonblockingGet() angeschaut.
Leider bin ich ein totaler Anfänger in dem Bereich. Bei HTTPMOD habe ich zumindest ein GET hinbekommen.
Mit POST habe ich meine Probleme.
Hat vielleicht noch jemand einen Tipp?
Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: betateilchen am 31 August 2021, 08:58:40

my $param = {
                    url        => "https://demo.grocy.info/api/chores/1/execute",
                    method => "POST",
                    timeout    => 5,
                    callback   =>  sub() {},
                    header => "Content-Type: application/json"."\r\n"."accept: application/json",
                    data => { "tracked_time": "2021-08-29T19:41:39.824Z",  "done_by": 0 }
                };
HttpUtils_NonblockingGet($param);
Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: Borkk am 15 Dezember 2021, 00:09:30
Hallo Zusammen,

Ich schnappe mir mal diesen Threat, da ich vor einem ähnlichen Problem stehe. Ich möchte zwischen zwei entfernten FHEM Installationen, einen Dummy schalten. Hierfür habe ich eine API Schnittstelle via reverse Proxy usw. gebaut. Das Ganze funktioniert einwandfrei, ich kann nun über eine URL in der u.g. Form einen Dummy aus dem Internet heraus schalten.

https://user:password@api.fhemurl.de/fhem?cmd=set%20api_switch%20on&XHR=1 (https://user:password@api.fhemurl.de/fhem?cmd=set%20api_switch%20on&XHR=1)

Ich scheitere nun am Syntax für einen entsprechenden HttpUtils_NonblockingGet Aufruf aus FHEM.

api_dummy:.* {
{ HttpUtils_NonblockingGet ({ url=> "https://user:password@api.fhemurl.de/fhem?cmd=set%20api_switch%20on&XHR=1"})}
}


Fhem stört sich hier an dem @ zwischen url und Passwort

Ein weiterer Versuch:

api_dummy:.* 
my $param = {
                    url => "api.fhemurl.de/fhem",
                    user => "user",
                    pwd => "password,
                    method => "GET",
                    timeout => 5,
                    callback =>  sub() {},
                    header => "Content-Type: application/json"."\r\n"."accept: application/json",
                    data => { "?cmd=set%20api_switch%20on&XHR=1": 0 }
                };
HttpUtils_NonblockingGet($param);


bringt zwar keine Fehlermeldung, funktioniert aber auch nicht. :)

Ich würde mich über einen kleinen "Schubs" in die richtige Richtung freuen. 
Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: JudgeDredd am 15 Dezember 2021, 00:39:02
Ich scheitere nun am Syntax für einen entsprechenden HttpUtils_NonblockingGet Aufruf aus FHEM.
api_dummy:.* {
{ HttpUtils_NonblockingGet ({ url=> "https://user:password@api.fhemurl.de/fhem?cmd=set%20api_switch%20on&XHR=1"})}
}

Fhem stört sich hier an dem @ zwischen url und Passwort

Entweder die Hochkommata ersetzen:
api_dummy:.* {
{ HttpUtils_NonblockingGet ({ url=> 'https://user:password@api.fhemurl.de/fhem?cmd=set%20api_switch%20on&XHR=1'})}
}

Oder das @ escapen
api_dummy:.* {
{ HttpUtils_NonblockingGet ({ url=> "https://user:password\@api.fhemurl.de/fhem?cmd=set%20api_switch%20on&XHR=1"})}
}


Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: Borkk am 15 Dezember 2021, 07:41:29
Vielen Dank  :D geht wunderbar. Hab mir schon gedacht, das es nur eine Kleinigkeit sein kann.
Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: Borkk am 15 Dezember 2021, 08:02:47
Noch eine Frage, wie würde ich denn in den API Aufruf eine Variable einbauen?


api_dummy:.* {
my $z1 = urlEncode(ReadingsVal ("api_dummy","state",""));
{ HttpUtils_NonblockingGet ({ url=> 'https://user:password@api.fhemurl.de/fhem?cmd=set%20api_switch%20'.$z1'&XHR=1'})}
}


Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: JudgeDredd am 15 Dezember 2021, 09:16:27
Zitat von: Borkk am 15 Dezember 2021, 08:02:47
Noch eine Frage, wie würde ich denn in den API Aufruf eine Variable einbauen?
Ich kaufen ein Punkt  ;)

Für den String concat brauchst Du davor und danach einen Punkt.
HttpUtils_NonblockingGet ({ url=> 'https://user:password@api.fhemurl.de/fhem?cmd=set%20api_switch%20'.$z1.'&XHR=1'})
Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: Borkk am 15 Dezember 2021, 09:47:38
Manchmal sind es die kleinen Dinge die einen glücklich machen  8) :D

Danke !!!
Titel: Antw:API POST mit HTTPMOD ansprechen
Beitrag von: Borkk am 15 Dezember 2021, 10:39:03
Der Vollständigkeit halber für alle die hier mitlesen. Der korrekte Aufruf sieht dann wie folgt aus.


api_dummy:.* {
my $z1 = urlEncode(Value ("api_dummy"));
{ HttpUtils_NonblockingGet ({ url=> 'https://user:password@api.fhemurl.de/fhem?cmd=set%20api_switch%20'.$z1.'&XHR=1'})}
}


nochmal Danke an JudgeDredd für die schnelle Hilfe.