HttpUtils: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
K (Rechtschreibung, Stil)
Zeile 14: Zeile 14:
* HttpUtils_BlockingGet
* HttpUtils_BlockingGet


ein sogenannter "blockierender" Aufruf durchgeführt wird. Dass bedeutet, dass FHEM bei einem Aufruf einer dieser Funktionen solange wartet und dabei absolut nichts macht solange bis die Antwort vom HTTP Server eintrifft und die Funktion damit beendet ist. Das kann bei Verbindungsproblemen evtl. dazu führen, dass FHEM für die gesamte Wartezeit (Timeout) steht und nichts verarbeitet. Problematisch ist so etwas gerade bei Anwendungen oder Hardware die eine zeitnahe Reaktion von FHEM erwarten (z.B. HomeMatic Geräte).
ein sogenannter "blockierender" Aufruf durchgeführt wird. Das bedeutet, dass FHEM bei einem Aufruf einer dieser Funktionen solange wartet und dabei absolut nichts macht, bis die Antwort vom HTTP-Server eintrifft und die Funktion damit beendet ist. Das kann bei Verbindungsproblemen evtl. dazu führen, dass FHEM für die gesamte Wartezeit (Timeout) steht und nichts verarbeitet. Problematisch ist so etwas gerade bei Anwendungen oder Hardware, die eine zeitnahe Reaktion von FHEM erwarten (z.B. HomeMatic-Geräte).


Es wird daher empfohlen die Funktionen so sparsam wie möglich zu verwenden und die Timeouts so niedrig wie möglich zu halten um ein längeres Einfrieren von FHEM möglichst zu verhindern.
Es wird daher empfohlen die Funktionen so sparsam wie möglich zu verwenden und die Timeouts so niedrig wie möglich zu halten um ein längeres Einfrieren von FHEM möglichst zu verhindern.
Zeile 43: Zeile 43:


''mandatory''
''mandatory''
|| Der DNS Name oder die IP-Adresse des HTTP-Servers<br><br>
|| Der DNS-Name oder die IP-Adresse des HTTP-Servers<br><br>
Beispiel:
Beispiel:


Zeile 63: Zeile 63:
=== GetFileFromURL ===
=== GetFileFromURL ===


Die Funktion GetFileFromURL ruft die HTTP URL auf und gibt als Funktionsergebnis den Seiteninhalt zurück. Im Gegensatz zu GetHttpFile beinhaltet GetFileFromURL einige Zusatzoptionen in Form von Funktionsparametern.
Die Funktion GetFileFromURL ruft die HTTP-URL auf und gibt als Funktionsergebnis den Seiteninhalt zurück. Im Gegensatz zu GetHttpFile beinhaltet GetFileFromURL einige Zusatzoptionen in Form von Funktionsparametern.




Zeile 75: Zeile 75:


''mandatory''
''mandatory''
|| Die HTTP URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.<br><br>
|| Die HTTP-URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.<br><br>
Beispiel:
Beispiel:


Zeile 96: Zeile 96:


''optional''
''optional''
|| Wenn man Daten via HTTP POST übertragen möchte, so kann man die Nutzdaten über $data übergeben. Die Daten werden dabei als Formulardaten übertragen. Wenn man den Content-Type beeinflussen möchte, oder mehrere Formular-Felder senden möchte, sollte man zur Funktion HttpUtils_BlockingGet oder HttpUtils_NonblockingGet greifen.
|| Wenn man Daten via HTTP-POST übertragen möchte, so kann man die Nutzdaten über $data übergeben. Die Daten werden dabei als Formulardaten übertragen. Wenn man den Content-Type beeinflussen oder mehrere Formular-Felder senden möchte, sollte man zur Funktion HttpUtils_BlockingGet oder HttpUtils_NonblockingGet greifen.




Standartwert: ''[leer]''
Standardwert: ''[leer]''


|-
|-
Zeile 105: Zeile 105:


''optional''
''optional''
|| Wenn $noshutdown auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abwartet.
|| Wenn $noshutdown auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abgewartet wird.




Zeile 113: Zeile 113:


''optional''
''optional''
|| Das Loglevel in dem sämtliche Logmeldungen zu dieser HTTP Abfrage erzeugt werden sollen.
|| Das Logleve, in dem sämtliche Logmeldungen zu dieser HTTP-Abfrage erzeugt werden sollen.




Zeile 135: Zeile 135:


''mandatory''
''mandatory''
|| Die HTTP URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.<br><br>
|| Die HTTP-URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.<br><br>
Beispiel:
Beispiel:


Zeile 156: Zeile 156:


''optional''
''optional''
|| Wenn man Daten via HTTP POST übertragen möchte, so kann man die Nutzdaten über <code>$data</code> übergeben. Die Daten werden dabei als Formulardaten übertragen. Wenn man den Content-Type beeinflussen möchte, oder mehrere Formular-Felder senden möchte, sollte man zur Funktion HttpUtils_BlockingGet oder HttpUtils_NonblockingGet greifen.
|| Wenn man Daten via HTTP-POST übertragen möchte, so kann man die Nutzdaten über <code>$data</code> übergeben. Die Daten werden dabei als Formulardaten übertragen. Wenn man den Content-Type beeinflussen möchte, oder mehrere Formular-Felder senden möchte, sollte man zur Funktion HttpUtils_BlockingGet oder HttpUtils_NonblockingGet greifen.




Standartwert: ''[leer]''
Standardwert: ''[leer]''


|-
|-
Zeile 165: Zeile 165:


''optional''
''optional''
|| Wenn $noshutdown auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abwartet.
|| Wenn $noshutdown auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abgewartet wird.




Zeile 173: Zeile 173:


''optional''
''optional''
|| Das Loglevel in dem sämtliche Logmeldungen zu dieser HTTP Abfrage erzeugt werden sollen.
|| Das Loglevel, in dem sämtliche Logmeldungen zu dieser HTTP-Abfrage erzeugt werden sollen.




Zeile 197: Zeile 197:


''mandatory''
''mandatory''
  || Die HTTP URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.<br><br>
  || Die HTTP-URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.<br><br>
Beispiel:
Beispiel:


Zeile 219: Zeile 219:


''optional''
''optional''
|| Wenn man Daten via HTTP POST übertragen möchte, so kann man die Nutzdaten über <code>$param{data}</code> übergeben. Die Daten werden dabei als Formulardaten übertragen. Die Daten können dabei auf zwei Arten übergeben werden:
|| Wenn man Daten via HTTP-POST übertragen möchte, so kann man die Nutzdaten über <code>$param{data}</code> übergeben. Die Daten werden dabei als Formulardaten übertragen. Die Daten können dabei auf zwei Arten übergeben werden:


1. Daten als String:
1. Daten als String:
Zeile 227: Zeile 227:




Standartwert: ''[leer]''
Standardwert: ''[leer]''


|-
|-
Zeile 233: Zeile 233:


''optional''
''optional''
||Wenn <code>$param->{noshutdown}</code> auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abwartet.
||Wenn <code>$param->{noshutdown}</code> auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abgewartet wird.




Zeile 241: Zeile 241:


''optional''
''optional''
|| Das Loglevel in dem sämtliche Logmeldungen zu dieser HTTP Abfrage erzeugt werden sollen.
|| Das Loglevel, in dem sämtliche Logmeldungen zu dieser HTTP-Abfrage erzeugt werden sollen.




Zeile 257: Zeile 257:


''optional''
''optional''
|| Die HTTP Methode, welche zur Abfrage verwendet werden soll. Sofern keine Daten übertragen werden ist dies standardmäßig "GET", ansonsten "POST". Es können aber auch andere Methoden verwendet werden.
|| Die HTTP-Methode, welche zur Abfrage verwendet werden soll. Sofern keine Daten übertragen werden ist dies standardmäßig "GET", ansonsten "POST". Es können aber auch andere Methoden verwendet werden.




Zeile 265: Zeile 265:


''optional''
''optional''
|| Eigene HTTP-Header Zeilen können über diesen Parameter eingebracht werden. Er kann dazu genutzt werden um z.B. den Content-Type festzulegen, oder einfach nur zusätzliche Header-Felder zu setzen. Mehrere Header-Zeilen müssen dabei mit "\r\n" getrennt werden.
|| Eigene HTTP-Header-Zeilen können über diesen Parameter eingebracht werden. Er kann dazu genutzt werden um z.B. den Content-Type festzulegen, oder einfach nur zusätzliche Header-Felder zu setzen. Mehrere Header-Zeilen müssen dabei mit "\r\n" getrennt werden.




Zeile 278: Zeile 278:


''optional''
''optional''
|| Die HTTP Version, welche zur Abfrage verwendet werden soll. Standardmäßig werden alle Abfragen mit HTTP/1.0 durchgeführt. Falls es jedoch notwendig ist HTTP/1.1 zu verwenden, so sollte <code>$param->{httpversion}</code> auf "1.1" gesetzt werden. Bei Version 1.1 wird automatisch der Header "<code>Connection: close</code>" implizit mitgesendet.
|| Die HTTP-Version, welche zur Abfrage verwendet werden soll. Standardmäßig werden alle Abfragen mit HTTP/1.0 durchgeführt. Falls es jedoch notwendig ist HTTP/1.1 zu verwenden, so sollte <code>$param->{httpversion}</code> auf "1.1" gesetzt werden. Bei Version 1.1 wird automatisch der Header "<code>Connection: close</code>" implizit mitgesendet.




Zeile 307: Zeile 307:


=== HttpUtils_NonblockingGet ===
=== HttpUtils_NonblockingGet ===
{{Randnotiz|RNText=Die Funktion HttpUtils_NonblockingGet ist nicht komplett durchgehend "non-blocking". DNS-Abfragen sind nachwievor blockierend. Insbesondere wenn der DNS Name nicht aufgelöst werden kann.}}
{{Randnotiz|RNText=Die Funktion HttpUtils_NonblockingGet ist nicht komplett durchgehend "non-blocking". DNS-Abfragen sind nachwievor blockierend. Insbesondere wenn der DNS-Name nicht aufgelöst werden kann.}}
Diese Funktion arbeitet ähnlich wie HttpUtils_BlockingGet. Allerdings wird das Ergebnis nicht als Funktionsergebnis zurückgegeben. Die Funktion HttpUtils_NonblockingGet initiert den Verbindungsaufbau und übergibt alles weitere an FHEM interne Routinen. Sobald eine Antwort vom HTTP-Server eintrifft, wird eine Callback-Funktionen mit verschiedenen Parametern (unter anderem auch das Ergebnis) aufgerufen, um die Antwort entgegenzunehmen und weiter zu verarbeiten.
Diese Funktion arbeitet ähnlich wie HttpUtils_BlockingGet. Allerdings wird das Ergebnis nicht als Funktionsergebnis zurückgegeben. Die Funktion HttpUtils_NonblockingGet initiiert den Verbindungsaufbau und übergibt alles weitere an FHEM interne Routinen. Sobald eine Antwort vom HTTP-Server eintrifft, wird eine Callback-Funktion mit verschiedenen Parametern (unter anderem auch das Ergebnis) aufgerufen, um die Antwort entgegenzunehmen und weiter zu verarbeiten.




Zeile 324: Zeile 324:


''mandatory''
''mandatory''
|| Eine Funktion (oder eine Referenz auf eine Funktion), welche die Ergebnisdaten entgegen nimmt und die Antwort entsprechend weiterverarbeitet. Die Callback-Funktion muss dabei 3 Parameter erwarten. Die Funktionsparameter der Callback-Funktion werden im nachfolgenden Abschnitt näher erläutert.
|| Eine Funktion (oder eine Referenz auf eine Funktion), welche die Ergebnisdaten entgegennimmt und die Antwort entsprechend weiterverarbeitet. Die Callback-Funktion muss dabei 3 Parameter erwarten. Die Funktionsparameter der Callback-Funktion werden im nachfolgenden Abschnitt näher erläutert.




Zeile 359: Zeile 359:
Es ist möglich, dass der Parameter-Hash nach erfolgter Abfrage zusätzliche oder veränderte Elemente enthält:
Es ist möglich, dass der Parameter-Hash nach erfolgter Abfrage zusätzliche oder veränderte Elemente enthält:
* '''<code>$param->{redirects}</code>''' - Die Anzahl an Umleitungen die erfolgte, bis die Anfrage beantwortet wurde.
* '''<code>$param->{redirects}</code>''' - Die Anzahl an Umleitungen die erfolgte, bis die Anfrage beantwortet wurde.
* '''<code>$param->{url}</code>''' - Die URL die nach erfolgter Umleitung die Anfrage beantwortet hat.
* '''<code>$param->{url}</code>''' - Die URL, die nach erfolgter Umleitung die Anfrage beantwortet hat.
* '''<code>$param->{protocol}</code>''' - Das verwendete Protokoll, welches zur Abfrage verwendet wurde ("http" oder "https").
* '''<code>$param->{protocol}</code>''' - Das verwendete Protokoll, welches zur Abfrage verwendet wurde ("http" oder "https").
* '''<code>$param->{path}</code>''' - Der Pfad welche auf dem HTTP-Server angefragt wurde.
* '''<code>$param->{path}</code>''' - Der Pfad, welcher auf dem HTTP-Server angefragt wurde.
* '''<code>$param->{host}</code>''' - Der Name oder die IP-Adresse des HTTP-Servers.
* '''<code>$param->{host}</code>''' - Der Name oder die IP-Adresse des HTTP-Servers.
* '''<code>$param->{code}</code>''' - Der HTTP Statuscode mit dem die Anfrage vom Server beantwortet wurde
* '''<code>$param->{code}</code>''' - Der HTTP-Statuscode, mit dem die Anfrage vom Server beantwortet wurde.
* '''<code>$param->{addr}</code>''' - Die HTTP URL ohne Pfad und evtl. Authentifizerungsinformationen des HTTP-Servers (z.B. "<nowiki>http://myserver.com:8080</nowiki>")
* '''<code>$param->{addr}</code>''' - Die HTTP-URL ohne Pfad und evtl. Authentifizerungsinformationen des HTTP-Servers (z.B. "<nowiki>http://myserver.com:8080</nowiki>").
* '''<code>$param->{auth}</code>''' - Der Authentifizierungs-String, welcher verwendet wurde um sich gegenüber dem HTTP-Server zu authentifizieren. (nur wenn Authentifizierung benutzt wurde)
* '''<code>$param->{auth}</code>''' - Der Authentifizierungs-String, welcher verwendet wurde um sich gegenüber dem HTTP-Server zu authentifizieren (nur wenn Authentifizierung benutzt wurde).
|-
|-
| style="vertical-align:top" | '''<code>$err</code>'''|| Falls beim Aufruf der URL ein Fehler aufgetreten ist (z.B. Server nicht erreichbar oder Verbindungstimeout), dann ist dieser Wert mit einer Fehlermeldung gefüllt.  
| style="vertical-align:top" | '''<code>$err</code>'''|| Falls beim Aufruf der URL ein Fehler aufgetreten ist (z.B. Server nicht erreichbar oder Verbindungstimeout), dann ist dieser Wert mit einer Fehlermeldung gefüllt.  
Zeile 378: Zeile 378:
|}
|}


Die Callback-Funktion kann nun die Daten aus der HTTP Antwort verarbeiten oder bei Fehler entsprechende Log-Meldungen ausgeben.
Die Callback-Funktion kann nun die Daten aus der HTTP-Antwort verarbeiten oder bei Fehler entsprechende Log-Meldungen ausgeben.




==== Programmierbeispiel für HttpUtils_NonblockingGet() ====
==== Programmierbeispiel für HttpUtils_NonblockingGet() ====


Das folgende Beispiel soll als Hilfestellung für eigene Anwendungen geben
Das folgende Beispiel soll eine Hilfestellung für eigene Anwendungen geben


<pre>use HttpUtils;
<pre>use HttpUtils;

Version vom 1. Dezember 2014, 14:27 Uhr

Allgemein

Das Modul HttpUtils.pm ist sowohl für Modulentwickler, als auch Endanwender gedacht um Daten via HTTP auszutauschen. Es stellt dabei eine Reihe von Funktionen bereit, auf die in diesem Artikel näher eingegangen werden soll.

Erstellt wurde HttpUtils.pm von Rudolf König.

Die Funktionen im Einzelnen

Es ist zu beachten, dass bei den Funktionen

  • GetHttpFile
  • GetFileFromURL
  • GetFileFromURLQuiet
  • HttpUtils_BlockingGet

ein sogenannter "blockierender" Aufruf durchgeführt wird. Das bedeutet, dass FHEM bei einem Aufruf einer dieser Funktionen solange wartet und dabei absolut nichts macht, bis die Antwort vom HTTP-Server eintrifft und die Funktion damit beendet ist. Das kann bei Verbindungsproblemen evtl. dazu führen, dass FHEM für die gesamte Wartezeit (Timeout) steht und nichts verarbeitet. Problematisch ist so etwas gerade bei Anwendungen oder Hardware, die eine zeitnahe Reaktion von FHEM erwarten (z.B. HomeMatic-Geräte).

Es wird daher empfohlen die Funktionen so sparsam wie möglich zu verwenden und die Timeouts so niedrig wie möglich zu halten um ein längeres Einfrieren von FHEM möglichst zu verhindern.


Alternativ kann man die Funktion

  • HttpUtils_NonblockingGet

verwenden, welche ein Blockieren von FHEM verhindert. Wie das genau funktioniert, wird in dem entsprechenden Kapitel beschrieben.


Folgende Funktionen sind für Modulentwickler/Endanwender zur direkten Nutzung gedacht:


GetHttpFile

Die Funktion GetHttpFile ist die denkbar einfachste Variante um eine URL aufzurufen.


Aufruf: GetHttpFile($server, $file)

Parameter Bedeutung
$server

mandatory

Der DNS-Name oder die IP-Adresse des HTTP-Servers

Beispiel:

  • www.myhost.com
  • 192.168.0.10
$file

mandatory

Die Datei, welche auf dem HTTP-Server aufgerufen werden soll.

Beispiel:

  • /
  • /index.html
  • /directory/image.jpg

Funktionsergebnis ist der Inhalt der aufgerufenen Seite in Form eines Strings.

GetFileFromURL

Die Funktion GetFileFromURL ruft die HTTP-URL auf und gibt als Funktionsergebnis den Seiteninhalt zurück. Im Gegensatz zu GetHttpFile beinhaltet GetFileFromURL einige Zusatzoptionen in Form von Funktionsparametern.


Aufruf: GetFileFromURL($url, [$timeout], [$data], [$noshutdown], [$loglevel])

Parameter Bedeutung
$url

mandatory

Die HTTP-URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.

Beispiel:

  • http://www.myhost.com/directory/
  • https://www.myhost.com/
  • http://www.myhost.com:8080/
  • http://foo:bar@www.myhost.com/
$timeout

optional

Die maximale Dauer in Sekunden für die HTTP-Anfrage


Beispiel: 5 (Sekunden)

Standardwert: 4 Sekunden

$data

optional

Wenn man Daten via HTTP-POST übertragen möchte, so kann man die Nutzdaten über $data übergeben. Die Daten werden dabei als Formulardaten übertragen. Wenn man den Content-Type beeinflussen oder mehrere Formular-Felder senden möchte, sollte man zur Funktion HttpUtils_BlockingGet oder HttpUtils_NonblockingGet greifen.


Standardwert: [leer]

$noshutdown

optional

Wenn $noshutdown auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abgewartet wird.


Standardwert: 1

$loglevel

optional

Das Logleve, in dem sämtliche Logmeldungen zu dieser HTTP-Abfrage erzeugt werden sollen.


Standardwert: 4

Funktionsergebnis ist der Inhalt der aufgerufenen Seite in Form eines Strings.

GetFileFromURLQuiet

Diese Funktion funktioniert ähnlich wie GetFileFromURL. Allerdings wird die tatsächliche URL in allen erzeugten Log-Meldungen unkenntlich gemacht um z.B. Zugangsdaten nicht preiszugeben. Die aufgerufene Seite wird ebenfalls als Funktionsergebnis zurückgegeben.


Aufruf: GetFileFromURLQuiet($url, [$timeout], [$data], [$noshutdown], [$loglevel])

Parameter Bedeutung
$url

mandatory

Die HTTP-URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.

Beispiel:

  • http://www.myhost.com/directory/
  • https://www.myhost.com/
  • http://www.myhost.com:8080/
  • http://foo:bar@www.myhost.com/
$timeout

optional

Die maximale Dauer in Sekunden für die HTTP-Anfrage


Beispiel: 5 (Sekunden)

Standardwert: 4 Sekunden

$data

optional

Wenn man Daten via HTTP-POST übertragen möchte, so kann man die Nutzdaten über $data übergeben. Die Daten werden dabei als Formulardaten übertragen. Wenn man den Content-Type beeinflussen möchte, oder mehrere Formular-Felder senden möchte, sollte man zur Funktion HttpUtils_BlockingGet oder HttpUtils_NonblockingGet greifen.


Standardwert: [leer]

$noshutdown

optional

Wenn $noshutdown auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abgewartet wird.


Standardwert: 1

$loglevel

optional

Das Loglevel, in dem sämtliche Logmeldungen zu dieser HTTP-Abfrage erzeugt werden sollen.


Standardwert: 4

Funktionsergebnis ist der Inhalt der aufgerufenen Seite in Form eines Strings.

HttpUtils_BlockingGet

Wenn die bisher genannten Funktionen nicht ausreichen um die gewünschte Abfrage durchzuführen, so kann man diese Funktion verwenden. Aufgrund zahlreicher Parameter ermöglicht sie viele Anpassungsmöglichkeiten. Diese Funktion hat dabei nicht wie üblich eine Liste an Funktionsparametern, sondern lediglich einen Parameter, welcher ein Hash mit allen Funktionsparametern darstellt. Dieser Hash enthält sämtliche Parameter inkl. Werten.


Aufruf: HttpUtils_BlockingGet($param)

Der Hash $param kann folgende Optionen beinhalten:

Parameter Bedeutung
$param->{url}

mandatory

Die HTTP-URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.

Beispiel:

  • http://www.myhost.com/directory/
  • https://www.myhost.com/
  • http://www.myhost.com:8080/
  • http://foo:bar@www.myhost.com/
$param->{timeout}

optional

Die maximale Dauer in Sekunden für die HTTP-Anfrage


Beispiel: 5 (Sekunden)

Standardwert: 4 Sekunden

$param->{data}

optional

Wenn man Daten via HTTP-POST übertragen möchte, so kann man die Nutzdaten über $param{data} übergeben. Die Daten werden dabei als Formulardaten übertragen. Die Daten können dabei auf zwei Arten übergeben werden:

1. Daten als String:

  • Die Daten werden komplett als gesamter String in $param{data} abgelegt (z.B.: $param{data} = "Jede Menge tolle Daten").

2. Daten als Hash:

  • Die Daten werden als Hash mit Key-Value-Pairs übergeben (z.B.: $param{data}{field1} = "value1", $param{data}{field2} = "value2", ... ). Die Daten werden dann als Formulardaten mit mehrfachen Datenfeldern übertragen.


Standardwert: [leer]

$param->{noshutdown}

optional

Wenn $param->{noshutdown} auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abgewartet wird.


Standardwert: 1

$param->{loglevel}

optional

Das Loglevel, in dem sämtliche Logmeldungen zu dieser HTTP-Abfrage erzeugt werden sollen.


Standardwert: 4

$param->{hideurl}

optional

Wenn dieser Parameter den Wert 1 trägt, wird die URL in sämtlichen Log-Ausgaben unkenntlich gemacht. Dies ist nützlich um z.B. Zugangsdaten geheim zu halten.


Standardwert: 0

$param->{method}

optional

Die HTTP-Methode, welche zur Abfrage verwendet werden soll. Sofern keine Daten übertragen werden ist dies standardmäßig "GET", ansonsten "POST". Es können aber auch andere Methoden verwendet werden.


Standardwert: "GET"

$param->{header}

optional

Eigene HTTP-Header-Zeilen können über diesen Parameter eingebracht werden. Er kann dazu genutzt werden um z.B. den Content-Type festzulegen, oder einfach nur zusätzliche Header-Felder zu setzen. Mehrere Header-Zeilen müssen dabei mit "\r\n" getrennt werden.


Beispiel:

  • User-Agent: Mozilla/1.22\r\nContent-Type: application/xml
  • Content-Type: application/xml


Standardwert: [leer]

$param->{httpversion}

optional

Die HTTP-Version, welche zur Abfrage verwendet werden soll. Standardmäßig werden alle Abfragen mit HTTP/1.0 durchgeführt. Falls es jedoch notwendig ist HTTP/1.1 zu verwenden, so sollte $param->{httpversion} auf "1.1" gesetzt werden. Bei Version 1.1 wird automatisch der Header "Connection: close" implizit mitgesendet.


Standardwert: "1.0"


Als Rückgabewert von HttpUtils_BlockingGet wird ein Array mit 2 Rückgabewerten zurückgegeben:

($err, $data) = HttpUtils_BlockingGet( … )

Diese 2 Rückgabewerten haben folgende Bedeutung:

Rückgabewert Bedeutung
$err Falls beim Aufruf der URL ein Fehler aufgetreten ist (z.B. Server nicht erreichbar oder Verbindungstimeout), dann ist dieser Wert mit einer Fehlermeldung gefüllt.


Wenn kein Fehler aufgetreten ist, ist dieser Wert mit einem Leerstring gefüllt ($err = "")

$data Die Ergebnisdaten, welche der HTTP-Server zurückgeliefert hat. Die Daten werden als Klartext in Form eines gesamten Strings zurückgegeben.


Falls ein Fehler aufgetreten ist, ist dieser Wert mit einem Leersting gefüllt ($data = "")

HttpUtils_NonblockingGet

Info green.pngDie Funktion HttpUtils_NonblockingGet ist nicht komplett durchgehend "non-blocking". DNS-Abfragen sind nachwievor blockierend. Insbesondere wenn der DNS-Name nicht aufgelöst werden kann.

Diese Funktion arbeitet ähnlich wie HttpUtils_BlockingGet. Allerdings wird das Ergebnis nicht als Funktionsergebnis zurückgegeben. Die Funktion HttpUtils_NonblockingGet initiiert den Verbindungsaufbau und übergibt alles weitere an FHEM interne Routinen. Sobald eine Antwort vom HTTP-Server eintrifft, wird eine Callback-Funktion mit verschiedenen Parametern (unter anderem auch das Ergebnis) aufgerufen, um die Antwort entgegenzunehmen und weiter zu verarbeiten.


Der Aufruf ist daher ähnlich zu HttpUtils_BlockingGet mit nur einem Parameter-Hash:

Aufruf: HttpUtils_NonblockingGet($param)

Parameter Bedeutung

Alle Hash-Parameter, welche für HttpUtils_BlockingGet gelten, sind auch für HttpUtils_NonblockingGet gültig


$param->{callback}

mandatory

Eine Funktion (oder eine Referenz auf eine Funktion), welche die Ergebnisdaten entgegennimmt und die Antwort entsprechend weiterverarbeitet. Die Callback-Funktion muss dabei 3 Parameter erwarten. Die Funktionsparameter der Callback-Funktion werden im nachfolgenden Abschnitt näher erläutert.


Beispiel:

  • $param->{callback} = \&MyCallbackFn(Referenzzeiger auf Funktionsname)
  • $param->{callback} = sub($$$){ … }(direkte Funktionsdefinition)
Benutzerdefinierte Parameter Es können im Hash weitere benutzerdefinierte Parameter gesetzt werden, welche evtl. in der Callback-Funktion benötigt werden, um die Antwort korrekt zu verarbeiten.

Zum Beispiel bei der Modul-Programmierung währe das $hash des aktuellen Devices. Alle gesetzten Parameter sind in der Callback-Funktion direkt abrufbar und können ausgewertet werden.


Beispiel:

  • $param->{hash} = $hash
  • $param->{command} = "on"


Ein Funktionsrückgabewert von HttpUtils_NonblockingGet existiert nicht, da die eigentliche Rückgabe der Daten über die Callback-Funktion erfolgt. Die Callback-Funktion wird aufgerufen, sobdald der HTTP-Request abgeschlossen ist, oder ein Fehler aufgetreten ist. Der Funktionsaufruf erfolgt mit den folgenden Parametern:

MyCallbackFn ( $param, $err, $data )


Diese 3 Parameter haben dabei folgende Bedeutung:

Parameter Bedeutung
$param Der Parameter-Hash, mit allen Argumenten die beim Aufruf der Funktion übergeben worden sind.

Es ist möglich, dass der Parameter-Hash nach erfolgter Abfrage zusätzliche oder veränderte Elemente enthält:

  • $param->{redirects} - Die Anzahl an Umleitungen die erfolgte, bis die Anfrage beantwortet wurde.
  • $param->{url} - Die URL, die nach erfolgter Umleitung die Anfrage beantwortet hat.
  • $param->{protocol} - Das verwendete Protokoll, welches zur Abfrage verwendet wurde ("http" oder "https").
  • $param->{path} - Der Pfad, welcher auf dem HTTP-Server angefragt wurde.
  • $param->{host} - Der Name oder die IP-Adresse des HTTP-Servers.
  • $param->{code} - Der HTTP-Statuscode, mit dem die Anfrage vom Server beantwortet wurde.
  • $param->{addr} - Die HTTP-URL ohne Pfad und evtl. Authentifizerungsinformationen des HTTP-Servers (z.B. "http://myserver.com:8080").
  • $param->{auth} - Der Authentifizierungs-String, welcher verwendet wurde um sich gegenüber dem HTTP-Server zu authentifizieren (nur wenn Authentifizierung benutzt wurde).
$err Falls beim Aufruf der URL ein Fehler aufgetreten ist (z.B. Server nicht erreichbar oder Verbindungstimeout), dann ist dieser Wert mit einer Fehlermeldung gefüllt.


Wenn kein Fehler aufgetreten ist, ist dieser Wert mit einem Leerstring gefüllt ($err = "")

$data Die Ergebnisdaten, welche der HTTP-Server zurückgeliefert hat. Die Daten werden als Klartext in Form eines gesamten Strings zurückgegeben. Es handelt sich hierbei ausschließlich um den HTTP-Body.


Falls ein Fehler aufgetreten ist, ist dieser Wert mit einem Leersting gefüllt ($data = "")

Die Callback-Funktion kann nun die Daten aus der HTTP-Antwort verarbeiten oder bei Fehler entsprechende Log-Meldungen ausgeben.


Programmierbeispiel für HttpUtils_NonblockingGet()

Das folgende Beispiel soll eine Hilfestellung für eigene Anwendungen geben

use HttpUtils;
sub X_GetHttpResponse($)
{
    my ($hash, $def) = @_;
    my $name = $hash->{NAME};
    my $param = {
                    url        => "http://www.foo.de",
                    timeout    => 5,
                    hash       => $hash,                                                                                  # Muss gesetzt werden, damit die Callback funktion wieder $hash hat
                    method     => "GET",                                                                                  # Lesen von Inhalten
                    header     => "agent: TeleHeater/2.2.3\r\nUser-Agent: TeleHeater/2.2.3\r\nAccept: application/json",  # Den Header gemäss abzufragender Daten ändern
                    callback   =>  \&X_ParseHttpResponse                                                                  # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten
                };
                          
    HttpUtils_NonblockingGet($param);                                                                                     # Starten der HTTP Abfrage. Es gibt keinen Return-Code. 
    
}


sub X_ParseHttpResponse($)
{

    my ($param, $err, $data) = @_;
    my $hash = $param->{hash};
    my $name = $hash->{NAME};

    if($err ne "")                                                                                                         # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
    {
        Log3 $name, 3, "error while requesting ".$param->{url}." - $err";                                                  # Eintrag fürs Log
        readingsSingleUpdate($hash, "fullResponse", "ERROR");                                                              # Readings erzeugen
    }

    elsif($data ne "")                                                                                                     # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
    {
        Log3 $name, 3, "url ".$param->{url}." returned: $data";                                                            # Eintrag fürs Log

        # An dieser Stelle die Antwort parsen / verarbeiten mit $data

        readingsSingleUpdate($hash, "fullResponse", $data);                                                                # Readings erzeugen
    }
    
    # Damit ist die Abfrage zuende.
    # Evtl. einen InternalTimer neu schedulen
}