HTTP-Aufruf aus einer Internetanwendung empfangen und verarbeiten

Es ist vielleicht eine einfache Frage und vielleicht gibt es Beiträge oder sogar Module dazu, aber meine Suche brachte keine brauchbaren Ergebnisse.

Ich habe eine Internetanwendung, welche per HTTP-Aufruf per HTTP-GET oder HTTP-POST Daten in Form eines JSON übermittelt. Dazu muss ich

  1. der Internetanwendung eine URL mitteilen. Ist das xxx.ipmagic.de?
  2. den HTTP-Aufruf in IPS empfangen und verarbeiten. Hier fehlt mir leider das know-how.
  3. den JSON-Datensatz verarbeiten. Das traue ich mir dann schon irgendwie wieder zu.

Über Hinweise bin ich dankbar.

Genau. Du willst einen WebHook verwenden und dann die ipmagic.de Adresse mit dem WebHook als Zieladresse angehen. Du bekommst dann die Daten in das Skript, welche du beim Hook hinterlegt hast.

paresy

Wie kann ich dann die Daten in dem Skript empfangen? Wie müsste dazu ein einfaches Skript aussehen? Ich würde vielleicht ersteinmal in eine Textbox schreiben, damit ich das grundsätzlich testen kann. Als zweiter Schritt wäre dann die JSON-Daten weiter zu verarbeiten.

Du richtest im Hook Control ein Skript als Empfänger ein, beispielsweise für den Hook „test“.

Dann geht die Anfrage deines Programms an …ipmagic.de/hook/test/.

Innerhalb des Skripts kannst du dann auf die Systemvariablen $_GET bzw. $_POST zugreifen, je nachdem, ob du GET oder POST verwendest, die du dann beispielsweise direkt per SetValue in eine Stringvariable schreiben kannst.

Ein Beispiel Script ist in der Dokumentation vorhanden, das gibt alle Variablen aus.
https://www.symcon.de/service/dokumentation/modulreferenz/webhook-control/
Michael

Entschuldigt bitte, aber da komm ich nicht ganz mit. Mein Ziel ist es, wie oben beschrieben den Datensatz aus dem HTTP-Aufruf in eine Stringvariable zu bringen.

SetValueString(35039, $_POST);

funktioniert so einfach nicht.
Aber wahrscheinlich muss ich GET und POST noch etwas genauer studieren.

Das Skript sieht für einen ersten Test richtig aus. Hast du den Hook auch korrekt im Hook Control registriert und führst auch einen POST aus?

Vielleicht kannst du ja mal einen Screenshot von deinem Hook Control posten und uns verraten auf welchen Endpunkt genau die Anwendung zugreift. Ich vermute bei einem davon einen Fehler.

Da $_POST in der Regel ein Array ist, würde ich zuerst mit dem Script aus der Doku testen!
Ein Array kannst du nicht so direkt in eine Symcon Variable schreiben.
Michael

Ich habe jetzt im Skript stehen:

SetValueString(35039, print_r($_POST, true));

In einem Test wurde auf die Variable etwas geschrieben. Mein Problem ist wahrscheinlich, dass die Anwendung, wo ich es eigentlich einsetzen möchte, irgendwie im Array nichts übergibt. Da muss ich die Seite erstmal näher beleuchten, was da los ist.

Ich habe jetzt nochmal den Sender überprüft, da wird etwas ausgesendet. Mit HTTP_POST wird folgendes übermittelt:

{
  "id": 52799,
  "message": "Nachricht",
  "startDate": "2020-09-22T07:31:44.948Z",
  "event": {
    "id": 43988,
    "name": "Name",
    "startDate": "2020-09-22T07:31:44.948Z"
  },
  "organizationID": 5714,
  "Resources": {
    "scenes": [8467],
    "users": [
      14402]
  },
  "creatorName": "Admin",
  "creatorID": 11604,
  "creatorType": "admin"
}

Mit meinen rudimentären Erfahrungen zu JSON würde ich z.B.:


<?php

//???wie empfange ich aus dem Webhook den Datensatz und schreibe ihn in $data??? oder anders???

$json = json_decode($data);
$Nachricht = $json->'message';
$Name = ($json->'event'->'name';
setvaluestring(23205, $Nachricht);
setvaluestring(29801, $Name);

Die Frage ist, ob das so richtig ist und vorallem wie ich den Datensatz empfange, um ihn weiter zu verarbeiten?

$_POST ist ein Array, also musst du gar nichts JSON decodieren, sondern kannst direkt darauf zugreifen. Also in deinem Fall beispielsweise


$Nachricht = $_POST['message'];
$Name = $_POST['event']['name'];

Das wäre ja einfach. Aber leider kommt die Fehlermeldung „Undefined index: message in …“. Das wird als Antwort geschickt, wenn ich den HTTP-Request abschicke.

nach oben schieb
Die Frage ist , wie ich die Daten in IPS empfangen und weiterverarbeiten kann?

Und die Antwort hast du schon bekommen.
Benutze das Script aus der Doku, dann siehst du welche Daten in welcher Variable liegen.


IPS_LogMessage("WebHook GET", print_r($_GET, true)); IPS_LogMessage("WebHook POST", print_r($_POST, true)); IPS_LogMessage("WebHook IPS", print_r($_IPS, true)); IPS_LogMessage("WebHook RAW", file_get_contents("php://input"));

Michael

In Webhook POST steht:

Array
(
    [{
__"id":_52799,
__"message":_"Nachricht",
__"startDate":_"2020-09-22T07:31:44_948Z",
__"event":_{
____"id":_43988,
____"name":_"Name",
____"startDate":_"2020-09-22T07:31:44_948Z"
__},
__"organizationID":_5714,
__"Resources":_{
____"scenes":_] => Array
        (
            [8467] => 
        )

)

Es scheint beim Sender noch etwas falsch zu sein. Denn die Daten stehen nur im RAW, das Array von POST ist leer und somit gibt es keine Variablen. Da muss ich mich erstmal mit dem Sender auseinander setzen.

RAW ist nicht unbedingt verkehrt, aber du Ausgabe oben passt irgendwie nicht.
Michael

Ja, die Ausgabe passt wahrscheinlich nicht weil ich da ein bisschen was durcheinander gebracht habe. Ich hatte die RAW-Ausgabe zur Simulation über webhook.site nochmal ausgesendet. Da kommt dieser Quatsch zustande.

Vom eigentlichen Sender kommt in RAW folgendes an:

{
  "id": 52799,
  "message": "Nachricht",
  "startDate": "2020-09-22T07:31:44.948Z",
  "event": {
    "id": 43988,
    "name": "Name",
    "startDate": "2020-09-22T07:31:44.948Z"
  },
  "organizationID": 5714,
  "Resources": {
    "scenes": [8467],
    "users": [
      14402]
  },
  "creatorName": "Admin",
  "creatorID": 11604,
  "creatorType": "admin"
}

Wie kann man das weiterverarbeiten?
Ich bleibe trotzdem noch dran, warum beim Sender nichts in dem POST-Array ausgesendet wird.

Weil es dir keine Daten in der Formatierung eines Formulars sendet, sondern einfach einen String.
Also nimm das aus RAW und mit json_decode kommst du dann an dein Ziel :slight_smile:
Michael

1 „Gefällt mir“

Did you ever find out how to put the „WebHook RAW“ data in a string variable?