API POST mit HTTPMOD ansprechen

Begonnen von Guenni1404, 29 August 2021, 22:23:30

Vorheriges Thema - Nächstes Thema

Guenni1404

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

betateilchen

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()

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

Guenni1404

Danke,
schaue ich mir mal an. Wenn Fragen sind melde ich mich.

Guenni1404

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?

betateilchen


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);
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Borkk

#5
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

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. 
Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)

JudgeDredd

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"})}
}


Router: Eigenbau (pfSense)
FHEM: Proxmox (DELL R720) | Debian 12 (VM)

Borkk

Vielen Dank  :D geht wunderbar. Hab mir schon gedacht, das es nur eine Kleinigkeit sein kann.
Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)

Borkk

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'})}
}


Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)

JudgeDredd

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'})
Router: Eigenbau (pfSense)
FHEM: Proxmox (DELL R720) | Debian 12 (VM)

Borkk

Manchmal sind es die kleinen Dinge die einen glücklich machen  8) :D

Danke !!!
Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)

Borkk

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.
Proxmox & Docker:  FHEM, Raspberrymatic, ConBee3, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana, HmIP Akt- /Sensoren, Shelly´s, Alexa, ASC, Gardena, E-Paper, FritzBox; (Tado° x), iBeacon, OLED ; ESP32/8266, SwitchBot ... (Netatmo & Homekit über HomeAssistant)