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