Community
    • Categories
    • Recent
    • Popular
    • Users
    • Search
    • Register
    • Login

    PHP API : api-client-php

    Scheduled Pinned Locked Moved Entwicklung
    8 Posts 3 Posters 2.6k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • B Offline
      boni127
      last edited by

      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 8

      die 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

      LFischerL 1 Reply Last reply Reply Quote 0
      • LFischerL Offline
        LFischer @boni127
        last edited by

        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

        U 1 Reply Last reply Reply Quote 0
        • B Offline
          boni127
          last edited by

          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.

          LFischerL 1 Reply Last reply Reply Quote 0
          • LFischerL Offline
            LFischer @boni127
            last edited by

            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

            1 Reply Last reply Reply Quote 0
            • B Offline
              boni127
              last edited by boni127

              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.

              8b906d73-21fb-436c-8c4d-0081fbaac502-image.png

              0fa3456f-5922-47e9-918c-584e125f1f02-image.png

              <?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
              ]);
              
              
              
              LFischerL 1 Reply Last reply Reply Quote 0
              • LFischerL Offline
                LFischer @boni127
                last edited by

                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

                1 Reply Last reply Reply Quote 0
                • U Offline
                  uhaase @LFischer
                  last edited by

                  @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...

                  LFischerL 1 Reply Last reply Reply Quote 0
                  • LFischerL Offline
                    LFischer @uhaase
                    last edited by

                    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 oder catsID mit object und category 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 und category 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 und cmdb.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

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post