Dienst via JSON RPC abfragen

Hallo, ich versuche aktuell einen Dienst, welcher mittels JSON-RPC verwaltet werden kann abzufragen.

URL https://serverip:port/api

Ich weiß nur leider gar nicht, wo ich anfangen soll… ich habe nun mal eine JSON Decoder Instanz angelegt und dort auch die entsprechenden Zugangsdaten eingetragen… Nun wie geht’s weiter?

Folgendes müsste ich an den Server senden

{
  "jsonrpc": "2.0",
  "id": "rpc_call_id",
  "method": "GetServerInfo",
  "params": {}
}

Und dies würde ich als Antwort bekommen

{
  "jsonrpc": "2.0",
  "id": "rpc_call_id",
  "result": {
    "ServerProductName_str": "serverproductname",
    "ServerVersionString_str": "serverversionstring",
    "ServerBuildInfoString_str": "serverbuildinfostring",
    "ServerVerInt_u32": 0,
    "ServerBuildInt_u32": 0,
    "ServerHostName_str": "serverhostname",
    "ServerType_u32": 0,
    "ServerBuildDate_dt": "2020-08-01T12:24:36.123",
    "ServerFamilyName_str": "serverfamilyname",
    "OsType_u32": 0,
    "OsServicePack_u32": 0,
    "OsSystemName_str": "ossystemname",
    "OsProductName_str": "osproductname",
    "OsVendorName_str": "osvendorname",
    "OsVersion_str": "osversion",
    "KernelName_str": "kernelname",
    "KernelVersion_str": "kernelversion"
  }
}

Wie kann ich die Anfrage an den Server senden um diese Antwort zu erhalten?

Ich glaube etwas an den Server senden (POST) kann der JSON Encoder nicht. Ich würde die Anfrage stattdessen per Script (CURL - POST) senden und direkt in diesem Script die Antwort auswerten.

Entsprechend Variablen (per Hand oder Script) anlegen. Per Script den IDENT setzen und dann entsprechend füllen.

Wenn es an konkreten Einzelschritten scheitert, melde dich nochmal mit deinen Gehversuchen hier.

Ich hab es auf anderem Wege geschafft. Ich habe an die URL /serverinfo gehangen (diese Methode benötigt kein Eingabewert) Nun funktioniert das Modul und listet alles sauber auf. Für andere Methoden funktioniert das leider nicht. Für das Abfragen der verbundenen Nutzer muss ich den Name des Servers mitgeben. Ich weiß leider nicht, wie ich das in die URL die ich im Modul angebe einbauen kann… bzw. fehlt mir die Info, wie ich die URL zusammenbauen muss.

Also für die Abfrage der User verlangt er folgendes:

{
  "jsonrpc": "2.0",
  "id": "rpc_call_id",
  "method": "EnumSession",
  "params": {
    "HubName_str": "hubname"
  }
}

Ich kann nun hingehen https://ipadresse:port/api/EnumSession jedoch komme ich ab da nicht weiter… hab schon json encoder ausgetestet… und es in allen möglichen Varianten hinten angehangen (zunächst im Browser)

/api/{„jsonrpc“: „2.0“,„id“: „rpc_call_id“,„method“: „Enumsession“,„params“: {„HubName_str“: hubname}} aber es funktioniert nicht :frowning:

Du musst die Daten per HTTP Post dahin senden. Da nützt es nichts irgendwas an die URL zu hängen.

Ich hab nun den Curl (bash) Befehl soweit fertig, dass ich es in der Console abfragen kann. Ich habe nun mal ganz simpel via

$result = exec('curl -X POST --data '{"jsonrpc":"2.0","id":"1","method":"EnumSession","params":{"HubName_str":"VPN"}}' https://serverip:port/api --insecure url --user "Serverbenutzer:Passwort" ');

Jedoch bekomme ich dann einen Syntax Fehler in Symcon :frowning:

Hier ist jetzt das Zauberwort ‚Escapen‘. Konkret werden die einfachen Hochkommatar bei --data '{ sowie etwa bei 2/3 bei }}’ das Problem sein.

Allerdings würde ich das direkt aus PHP abfragen.
Ich habe den String für dich mal hier eingegeben: curl-to-PHP: Convert Curl commands to PHP code

// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://serverip:port/api');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"EnumSession\",\"params\":{\"HubName_str\":\"VPN\"}}");
curl_setopt($ch, CURLOPT_USERPWD, 'Serverbenutzer' . ':' . 'Passwort');

$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);