PHP API : api-client-php
-
Hallo Zusammen,
ich möchte gerne auf die API von i-doit (open) zugreifen, leider komme ich nicht wirklich weiter. Ich habe die api-client-php heruntergeladen,
cd /home/system/php composer require idoit/apiclient
aber das Beispiel von der GitHub-Seite funktioniert schon nicht:
hello2.php
<?php use Idoit\APIClient\API; use Idoit\APIClient\Idoit; require_once 'vendor/autoload.php'; $api = new API([ API::URL => 'https://demo.i-doit.com/src/jsonrpc.php', API::KEY => 'c1ia5q', API::USERNAME => 'admin', API::PASSWORD => 'admin' ]); $request = new Idoit($api); $info = $request->readVersion(); var_dump($info);
php8.0 hello2.php
PHP Fatal error: Uncaught Error: Class "Idoit\APIClient\API" not found in /home/system/php/hello2.php:8
Stack trace:
#0 {main}
thrown in /home/system/php/hello2.php on line 8die erforderlichen PHP-Module sind installiert
php8.0 -m [PHP Modules] bcmath ... curl date ... json ... openssl ... zlib
Passe ich das USE an:
<?php use bheisig\idoitapi\API; use bheisig\idoitapi\Idoit; require_once 'vendor/autoload.php'; $api = new API([ API::URL => 'https://demo.i-doit.com/src/jsonrpc.php', API::KEY => 'c1ia5q', API::USERNAME => 'admin', API::PASSWORD => 'admin' ]); $request = new Idoit($api); $info = $request->readVersion(); var_dump($info);
ist zumindest das 'Class not found' verschwunden,
php8.0 hello.php PHP Fatal error: Uncaught RuntimeException: Unable to initiate cURL session in /home/system/php/vendor/idoit/apiclient/src/API.php:349 Stack trace: #0 /home/system/php/vendor/idoit/apiclient/src/API.php(549): bheisig\idoitapi\API->connect() #1 /home/system/php/vendor/idoit/apiclient/src/API.php(471): bheisig\idoitapi\API->execute() #2 /home/system/php/vendor/idoit/apiclient/src/Idoit.php(45): bheisig\idoitapi\API->request() #3 /home/system/php/hello.php(16): bheisig\idoitapi\Idoit->readVersion() #4 {main} thrown in /home/system/php/vendor/idoit/apiclient/src/API.php on line 349
aber so richtig gut sieht es noch immer nicht aus:
Grundsätzlich zugreifen kann ich auf den Server
curl --data '{"version": "2.0","method": "idoit.version","params": {"apikey":"c1ia5q","language": "en"},"id": 1}' --header "Content-Type:application/json" --user admin:admin https://demo.i-doit.com/src/jsonrpc.php {"id":1,"jsonrpc":"2.0","result":{"login":{"userid":"9","name":"i-doit Systemadministrator ","mail":"i-doit@acme-it.example","username":"admin","tenant":"ACME IT Solutions","language":"en"},"version":"26","step":"","type":"PRO"}}
Ich habe erstmal versucht den Demo-Rechner https://demo.i-doit.com/src/jsonrpc.php zu erreichen um Probleme mit meiner I-Doit Installation auszuschließen. php8.0 nutze ich, da i-Doit in der Version 25 noch "8.0.30 (8.0 recommended)" empfiehlt.
Hat jemand einen Tip für mich, was mache ich falsch?
Grüße -
Hey @boni127
das liegt daran, das wir den API Client schon lange nicht mehr mit einer Version getaggt haben. Die Version 0.10 ist noch aus 2020 - und Composer zieht "by default" nur getaggte Versionen.
Um den aktuellsten Stand zu bekommen müsstest du den API Client folgendermaßen anfordern:
composer req "idoit/apiclient:dev-main"
In den letzten drei Jahren wurde der API Client ein wenig umstrukturiert und ist umgezogen - daher die geänderten Namespaces.
Ich werde mal anstoßen eine Version zu taggen - es wäre durchaus an der Zeit
Viele Grüße
Leo -
Hi Leo,
vielen Dank für den Hinweis, da hätte ich sicher lange gesucht.
Die ersten Objekte konnte ich nun schon über die API angelegen, habe aber noch ein paar Schwierigkeiten um bspw. die Adresse bei einer Organisation zu setzen oder eine Person einer Organisation zuzuordnen.
Kannst Du mir noch einen schubs in die richtige Richtung geben?
Grüße Detlev.
-
Hey @boni127
also zum hinzufügen einer Adresse benötigst du nur die Objekt ID der entsprechenden Organisation. Anschließend solltest du so etwas hier schreiben und nutzen können:
(new CMDBCategory($api))->save(123, Category::CATG__ADDRESS, [ 'address' => "Mehrzeiliges\nTextfeld", 'street' => 'Musterstraße', 'house_no' => '123 A', 'stories' => 1, 'postcode' => '12345', 'city' => 'Musterstadt', 'region' => 'Region', 'country' => 'Land', 'description' => 'Beschreibung', ]);
Für die Personenzuweisung:
(new CMDBCategory($api))->save(123, Category::CATS__ORGANIZATION_CONTACT_ASSIGNMENT, [ 'object' => 321, // Personen Objekt-ID 'role' => 'Administrator', // Rolle via ID oder String ]);
Ich habe den Code jetzt nicht im einzelnen getestet, aber etwa so sollte es aussehen
VG Leo
-
Moin Leo,
ein paar kleine Änderungen musste ich vornehmen, aber so funktioniert es nun. Allerdings klappt die Zuweisung Person - Organization noch nicht. Mit C__CATS__ORGANIZATION_CONTACT_ASSIGNMENT wird im Objekt Person die zugeordnete Firma angezeigt, allerdings finde ich dieses Zuweisung nicht in der Organization.
<?php use Idoit\APIClient\API; use Idoit\APIClient\Idoit; use Idoit\APIClient\CMDBObject; use Idoit\APIClient\CMDBCategory; require_once 'vendor/autoload.php'; $api = new API([ API::URL => 'http://idoit.fritz.box/src/jsonrpc.php', API::KEY => '********', API::USERNAME => 'admin', API::PASSWORD => 'admin' ]); $objectc = new CMDBObject($api); #C__CATS__ORGANIZATION #C__OBJTYPE__ORGANIZATION $objectIDc = $objectc->create( 'C__OBJTYPE__ORGANIZATION', 'Company2', [ 'description' => 'Hier eine kleine Beschreibung' ] ); var_dump($objectIDc); (new CMDBCategory($api))->save($objectIDc, 'C__CATG__ADDRESS', [ 'address' => "Mehrzeiliges\nTextfeld", 'street' => 'Musterstraße', 'house_no' => '123 A', 'stories' => 1, 'postcode' => '12345', 'city' => 'Musterstadt', 'region' => 'Region', 'country' => 'Land', 'description' => 'Beschreibung', ]); $objectp = new CMDBObject($api); $objectIDp = $objectp->create( 'C__OBJTYPE__PERSON', 'Eva Mustermann', [ 'description' => 'Hier eine kleine Beschreibung2', ] ); var_dump($objectIDp); (new CMDBCategory($api))->save($objectIDp, 'C__CATS__PERSON_MASTER', [ 'street' => 'Musterstraße', 'city' => 'Musterstadt', 'description' => 'Beschreibung', 'mail' => 'abc@def.de', 'phone_home' => '12345', 'phone_company' => '123459', 'phone_mobile' => '1234587', ]); (new CMDBCategory($api))->save($objectIDc, 'C__CATS__ORGANIZATION_CONTACT_ASSIGNMENT', [ 'object' => $objectIDp, // Personen Objekt-ID 'role' => 'Administrator', // Rolle via ID oder String ]);
-
Hallo @boni127
ich fürchte das Thema ist tatsächlich etwas komplizierter als zunächst gedacht - das liegt an den verschiedenen Kategorien und Beziehungen zwischen zwei Objekten.
Ich habe noch mal reingeschaut. Um die Person einer Organisation zuzuweisen habe ich die Kategorie
C__CATS__PERSON_CONTACT_ASSIGNMENT
genutzt, das sieht dann so aus:(new CMDBCategory($api))->save($objectIDp, 'C__CATS__PERSON_CONTACT_ASSIGNMENT', [ 'object' => $objectIDc, // Organisation Objekt-ID 'role' => 'Administrator', // Rolle via ID oder String ]);
Viele Grüße
Leo -
@LFischer die Ankündigung des Anstossens eines neuen Taggings ist nun schon fast wieder ein Jahr her (September 2023). Da das Problem nur hier in diesem Forum mal ansprechend gelöst wurde, wird es wirklich mal Zeit für ein Update...
Sind die Arbeiten für die Unterstützung der REST-APIv2 im Client schon weit fortgeschritten? Würde nämlich gerne die API2 gerne mit dem Client zusammen nutzen... -
Hallo @uhaase
der API Client unterstützt noch keine der v2 Endpunkte - wobei das bisher auch gar nicht nötig ist. Die v2 Endpunkte wurden in erster Linie ins leben gerufen um die Parameter zu vereinheitlichen (z.B. werden
objID
,catgID
odercatsID
mitobject
undcategory
usw. getauscht) - der API Client übernimmt dies aber schon im Vergleich zur "rohen" Kommunikation mit der API.Ich muss auch gestehen das die v2 Endpunkte nur sehr langsam Fortschritte machen und viele der
object
undcategory
Endpunkte im v2 Kontext noch nicht existieren, da wir damit auf eine i-doit interne API aufbauen wollen, die noch nicht fertig ist.Ich denke lediglich die
cmdb.external.pull.v2
undcmdb.external.push.v2
müssten wir hier nachziehen, da es sich dabei um neue Endpunkte handelt die vorher nicht existiert haben.Oder wolltest du auf etwas anderes hinaus ?
Viele Grüße
Leo