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

    PHP API : api-client-php

    Entwicklung
    2
    6
    99
    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
      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
        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

        1 Reply Last reply Reply Quote 0
        • B
          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
            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
              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
                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
                • First post
                  Last post