idoit/apiclient

用于 i-doit 的 JSON-RPC API 的简单易用但功能丰富的客户端库

0.10 2020-04-07 12:03 UTC

This package is auto-updated.

Last update: 2024-09-18 09:05:36 UTC


README

用于 i-doit 的 JSON-RPC API 的简单易用但功能丰富的客户端库

Latest stable version Minimum PHP version Build status

请注意:此项目不是 synetics GmbH 的官方产品。synetics GmbH 不提供任何商业支持。

关于

i-doit 是一款用于 IT 文档和 CMDB(配置管理数据库)的软件应用程序。此应用程序非常有用,可以收集您关于正在处理的 IT 基础设施的所有知识。i-doit 是一个 Web 应用程序,并 具有详尽的 API,这对于自动化您的基础设施非常有用。

此 API 客户端库提供了一种简单但强大的抽象层,用于向 i-doit 的 API 发送请求。它完全用 PHP 编写。

功能

您为什么应该使用此 API 客户端库?有一些很好的理由

  • 易于使用
  • 每个 API 方法都有一个 PHP 函数
  • 支持批量请求(更快)
  • 发送用户定义的请求
  • 上传文件和图像
  • 支持登录和注销方法以保存会话
  • 自动跟随重定向(HTTP 301/302)
  • 使用可选的 HTTP 或 SOCKS5 代理
  • 验证 TLS 证书链
  • 错误时抛出异常
  • 许多示例
  • 文档齐全
  • 通过 Composer 易于安装
  • 经过大量集成测试

有什么新功能?请查看 变更日志

要求

在开始使用客户端之前满足这些简单要求

  • 运行中的 i-doit pro/open 实例,版本 1.18.1 或更高版本(较旧版本可能工作但不受支持)
  • i-doit API 扩展,版本 1.12.3 或更高版本(较旧版本可能工作但不受支持)
  • PHP,版本 8.0 或更高版本(建议使用 8.17.4 应该工作但已弃用)
  • PHP 模块 curldatejsonopensslzlib

一般来说,始终使用最新稳定版本以利用新功能、改进和错误修复。

安装

建议通过 Composer 安装此客户端。切换到您的项目根目录并获取最新稳定版本

composer require idoit/apiclient

您可以通过使用 @DEV 切换到当前开发分支,而不是坚持使用特定/最小版本

composer require "idoit/apiclient=@DEV"

更新

Composer 的一个巨大优势(除其他优势外)是您可以通过运行以下命令简单地更新 API 客户端库

composer update

使用方法

如果您使用 Composer,则应使用其自己的自动加载器

require_once 'vendor/autoload.php';

这就完成了。所有其他文件将在需要时自动加载。

配置

API 客户端库类需要配置

use Idoit\APIClient\API;

$api = new API([
    API::URL => 'https://demo.i-doit.com/src/jsonrpc.php',
    API::PORT => 443,
    API::KEY => 'c1ia5q',
    API::USERNAME => 'admin',
    API::PASSWORD => 'admin',
    API::LANGUAGE => 'en',
    API::PROXY => [
        API::PROXY_ACTIVE => false,
        API::PROXY_TYPE => 'HTTP', // 'HTTP' or 'SOCKS5'
        API::PROXY_HOST => 'proxy.example.net',
        API::PROXY_PORT => 8080,
        API::PROXY_USERNAME => '',
        API::PROXY_PASSWORD => ''
    ],
    API::BYPASS_SECURE_CONNECTION => false
]);
  • API::URL:i-doit 的 API 的 URL,可能是附加 src/jsonrpc.php 的基本 URL
  • API::PORT:可选端口号,Web 服务器在哪个端口号上监听;如果未设置,则 HTTP 使用端口号 80,HTTPS 使用端口号 443
  • API::KEY:API 密钥
  • API::USERNAMEAPI::PASSWORD:如果需要,则可选凭证,否则将使用 System API 用户
  • API::LANGUAGE: i-doit 的请求和响应将被翻译成这种语言(支持 deen);这是可选的;默认为用户首选语言
  • API::PROXY: 在客户端和服务器之间使用代理
    • API::PROXY_ACTIVE: 如果设置为 true,将使用代理设置
    • API::PROXY_TYPE: 使用 HTTP (API::PROXY_TYPE_HTTP) 或 SOCKS5 (API::PROXY_TYPE_SOCKS5) 代理
    • API::PROXY_HOST: 代理的 FQDN 或 IP 地址
    • API::PROXY_PORT: 代理服务器监听的端口
    • API::PROXY_USERNAMEAPI::PROXY_PASSWORD: 用于对代理进行身份验证的可选凭据
  • API::BYPASS_SECURE_CONNECTION: 设置为 true 以禁用与安全相关的 cURL 选项;默认为 false;在生产环境中不要设置此选项!

示例

一个基本的 "Hello, World!" 示例是获取有关您的 i-doit 实例的一些基本信息

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);

它很简单。更多示例请参阅下一部分。

登录和登出

关于 i-doit 的 API,您可以使用(并且应该使用)一个用户会话来执行您的操作。这可以在服务器端节省资源,并允许您在短时间内执行更多调用。

会话处理由 API 客户端库完成。您只需登录。并且,如果您是个好人,您会在工作完成后登出。

use Idoit\APIClient\API;

$api = new API([/* … */]);

$api->login();
// Do your stuff…
$api->logout();

如果您不确定您的会话处于哪种状态,请尝试 isLoggedIn()

$api->isLoggedIn(); // Returns true or false

预定义的方法

对于几乎所有情况,都有一个远程过程可以调用,以通过其 API 读取或操作 i-doit 的数据库。每个远程过程都分配到一个命名空间,以保持 API 的整洁和流畅。幸运的是,您不需要自己调用这些远程过程。API 客户端库为每个命名空间提供一个类,为每个远程过程提供一个方法。以下是一个快速概述

此外,此 API 客户端库还附带了一些方法作为远程过程调用缺失的解决方案。RPC cmdb.objects.create 不存在,但您可以使用 CMDBObjects::create()。它模拟缺失的 RPC,并为您提供了一种更简单、更快速的方式来操作您的 CMDB。

如果合理的话,对于大多数 RPC,都有方法来执行批量请求。例如,CMDBCategory::batchRead() 一次检索多个分类条目。

示例

在 i-doit 的数据库中搜索

use Idoit\APIClient\API;
use Idoit\APIClient\Idoit;

$api = new API([/* … */]);

$idoit = new Idoit($api);
$result = $idoit->search('Server XY');

var_dump($result);

同时执行多个搜索

use Idoit\APIClient\API;
use Idoit\APIClient\Idoit;

$api = new API([/* … */]);

$idoit = new Idoit($api);
$result = $idoit->batchSearch([
    'Server XY',
    'Client A',
    'John Doe'
]);

var_dump($result);

创建一个新对象

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObject;

$api = new API([/* … */]);

$object = new CMDBObject($api);
$objectID = $object->create(
    'C__OBJTYPE__SERVER',
    'Server XY'
);

var_dump($objectID);

读取关于对象的常见信息

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObject;

$api = new API([/* … */]);

$object = new CMDBObject($api);
$objectInfo = $object->read(42);

var_dump($objectInfo);

加载一个对象的所有数据

这将获取有关对象的一切信息:常见数据、分配的分类以及分类条目。

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObject;

$api = new API([/* … */]);

$object = new CMDBObject($api);
$objectInfo = $object->load(42);

var_dump($objectInfo);

方法 load() 大约触发 4 个 API 调用。所以请注意,如果它被大量使用。

更新现有对象

目前,您能够更新对象的标题

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObject;

$api = new API([/* … */]);

$object = new CMDBObject($api);
$object->update(
    42,
    [
        'title' => 'A shiny new object title'
    ]
);

创建或更新对象("upsert")

如果您想获取对象的标识符,但不确定它是否存在,请尝试 upsert。这意味着同时执行 "update" 和 "insert"。这意味着,如果对象存在,您将直接获取其标识符。如果不存在,则创建对象,然后您将获取其标识符。对象必须与类型和标题匹配。其他属性将被存储。

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObject;

$api = new API([/* … */]);

$object = new CMDBObject($api);
$object->upsert(
    'C__OBJTYPE__SERVER',
    'My little server',
    [
        'purpose' => 'Private stuff'
    ]
);

获取对象标识符

通过对象标题和(可选)类型获取对象标识符

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObjects;

$api = new API([/* … */]);

$object = new CMDBObjects($api);
$objectID = $object->getID('My little server');
$objectID = $object->getID('My little server', 'C__OBJTYPE__SERVER');

如果没有对象或存在多个对象,将抛出异常错误。

更改对象的文档状态

i-doit 有存档您的 IT 文档的概念。每个对象都有一个状态(normalarchived、标记为 deleted)。最后但同样重要的是,对象可能从数据库中删除。

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObject;

$api = new API([/* … */]);

$object = new CMDBObject($api);
$objectID = 42;
// Archive:
$object->archive($objectID);
// Mark as deleted:
$object->delete($objectID);
// Purge from database:
$object->purge($objectID);

创建多个对象

一次性创建多个对象

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObjects;

$api = new API([/* … */]);

$cmdbObjects = new CMDBObjects($api);

$objectIDs = $cmdbObjects->create(
    [
        ['type' => 'C__OBJTYPE__SERVER', 'title' => 'Server No. One'],
        ['type' => 'C__OBJTYPE__SERVER', 'title' => 'Server No. Two'],
        ['type' => 'C__OBJTYPE__SERVER', 'title' => 'Server No. Three']
    ]
);

var_dump($objectIDs);

读取多个对象

一次性读取多个对象可以通过几种方法实现。让我们看看

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObjects;

$api = new API([/* … */]);

$cmdbObjects = new CMDBObjects($api);

// Fetch every object:
$objects = $cmdbObjects->read();
var_dump($objects);

// Fetch max. 10 servers and sort them descending by title:
$objects = $cmdbObjects->read(['type' => 'C__OBJTYPE__SERVER'], 10, 0, 'title', CMDBObjects::SORT_DESCENDING);
var_dump($objects);

// Get them by their identifiers:
$objects = $cmdbObjects->readByIDs([1, 2, 3]);
var_dump($objects);

// Get all servers:
$objects = $cmdbObjects->readByType('C__OBJTYPE__SERVER');
var_dump($objects);

// Get archived clients:
$objects = $cmdbObjects->readArchived('C__OBJTYPE__CLIENT');
var_dump($objects);

// Get clients marked as deleted:
$objects = $cmdbObjects->readDeleted('C__OBJTYPE__CLIENT');
var_dump($objects);

更新多个对象

一次性更新多个对象

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObjects;

$api = new API([/* … */]);

$cmdbObjects = new CMDBObjects($api);

// Rename objects 1, 2, 3:
$cmdbObjects->update([
  ['id' => 1, 'title' => 'New name'],
  ['id' => 2, 'title' => 'Another name'],
  ['id' => 3, 'title' => 'Just a name'],
]);

归档/删除/清除多个对象

归档对象,将它们标记为已删除,甚至从数据库中清除它们

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObjects;

$api = new API([/* … */]);

$cmdbObjects = new CMDBObjects($api);

$cmdbObjects
    ->archive([1, 2, 3])
    ->delete([1, 2, 3])
    ->purge([1, 2, 3]);

按条件读取对象

允许的比较运算符有 '=', '!=', 'like', 'not like', '>', '>=', '<', '<=', '<>'。

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBCondition;

$api = new API([/* … */]);
$condition = new CMDBCondition($api);
$result = $condition->read(
    [
        [
            'property' => "C__CATG__ACCOUNTING-order_no",
            'comparison' => "=",
            'value' => "ORDER4711",
        ]
    ]
);

您可以使用多个条件并为它们添加运算符。允许的运算符是 'AND' 和 'OR'。

$result = $condition->read(
    [
        [
            'property' => "C__CATG__ACCOUNTING-order_no",
            'comparison' => "=",
            'value' => "ORDER4711",
        ],
        [
            'property' => "C__CATG__ACCOUNTING-order_no",
            'comparison' => "=",
            'value' => "ORDER0815",
            'operator' => 'OR',
        ]
    ]
);

为了使代码更易读,您可以使用条件辅助类。

use Idoit\APIClient\Condition;

$conditions = [
    new Condition("C__CATG__ACCOUNTING", "order_no", "=", "ORDER4711"),
    new Condition("C__CATG__ACCOUNTING", "order_no", "=", "ORDER4711", Condition::OR),
];
$result = $condition->read($conditions);

创建具有属性的分类条目

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBCategory;

$api = new API([/* … */]);

$category = new CMDBCategory($api);
$entryID = $this->category->save(
    42,
    'C__CATG__IP',
    [
        'net' => 123,
        'active' => 1,
        'primary' => 0,
        'net_type' => 1,
        'ipv4_assignment' => 2,
        'ipv4_address' =>  '10.20.10.100',
        'description' => 'API TEST'
    ]
);

var_dump($entryID);

或者,使用方法 CMDBCategory::batchCreate() 进行批量请求。

读取分类和属性

读取特定对象的一个或多个分类条目

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBCategory;

$api = new API([/* … */]);

$category = new CMDBCategory($api);
$result = $category->read(42, 'C__CATG__IP');

var_dump($result);

读取特定对象的特定分类条目

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBCategory;

$api = new API([/* … */]);

$category = new CMDBCategory($api);
$result = $category->readOneByID(42, 'C__CATG__IP', 23);

var_dump($result);

仅读取一个分类条目(当使用单值分类时,比 read() 更简单)

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBCategory;

$api = new API([/* … */]);

$category = new CMDBCategory($api);
$result = $category->readFirst(42, 'C__CATG__IP');

var_dump($result);

一次性读取多个对象和分类的数据

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBCategory;

$api = new API([/* … */]);

$category = new CMDBCategory($api);
$result = $category->batchRead(
    [23, 42],
    ['C__CATG__IP', 'C__CATG__MODEL']
);

var_dump($result);

更新分类和属性

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBCategory;

$api = new API([/* … */]);

$category = new CMDBCategory($api);
$category->save(
    42,
    'C__CATG__GLOBAL',
    [
        'cmdb_status' => 10
    ]
);

或者,使用方法 CMDBCategory::batchUpdate() 进行批量请求。

更改分类及其属性的文档状态

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBCategory;

$api = new API([/* … */]);

$category = new CMDBCategory($api);
// Archive:
$category->archive(42, 'C__CATG__CPU', 1);
// Mark as deleted:
$category->delete(42, 'C__CATG__CPU', 2);
// Purge from database:
$category->purge(42, 'C__CATG__CPU', 3);

在下拉菜单中创建值

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBDialog;

$api = new API([/* … */]);

$dialog = new CMDBDialog($api);

$entryID = $dialog->create('C__CATG__MODEL', 'title', 'My model');
var_dump($entryID);

$entryIDs = $dialog->batchCreate([
    'C__CATG__MODEL' => [
        'manufacturer' => 'My manufacturer',
        'title' => 'My model'
    ],
    'C__CATG__GLOBAL' => [
        'category' => [
            'cat 1',
            'cat 2',
            'cat 3'
        ],
        'purpose' => 'API TEST'
    ]
]);
var_dump($entryIDs);

从下拉菜单中获取值

i-doit 中的下拉菜单称为 "对话框"(只读)或 "对话框+"(可编辑)。

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBDialog;

$api = new API([/* … */]);

$dialog = new CMDBDialog($api);

$models = $dialog->read('C__CATG__MODEL', 'title');
var_dump($models);

$modelsAndManufacturers = $dialog->batchRead([
    'C__CATG__MODEL' => [
        'manufacturer',
        'title'
    ]
]);
var_dump($modelsAndManufacturers);

构建位置树

读取直接位于对象下的对象

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBLocationTree;

$api = new API([/* … */]);

$locationTree = new CMDBLocationTree($api);
$result = $locationTree->read(1);

var_dump($result);

递归地读取位于对象下的对象

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBLocationTree;

$api = new API([/* … */]);

$locationTree = new CMDBLocationTree($api);
$result = $locationTree->readRecursively(1);

var_dump($result);

获取对象之间的关系

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObjectsByRelation;

$api = new API([/* … */]);
$relation = new CMDBObjectsByRelation($api);

$result = $relation->read(
    10,
    'C__RELATION_TYPE__PERSON_ASSIGNED_GROUPS'
);

var_dump($result);

获取某人的工作场所组件

一个人可能被分配到具有多个组件的工作场所,如 PC、显示器和电话。这些组件可以通过人员获取。您需要对象 ID 或电子邮件地址。支持多个工作场所。

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBWorkstationComponents;

$api = new API([/* … */]);
$components = new CMDBWorkstationComponents($api);

$result = $components->read(111); // Person object with ID 111
var_dump($result);

$result = $components->batchRead([111, 222]); // Person objects with IDs 111 and 222
var_dump($result);

$result = $components->readByEMail('alice@example.org'); // Person object with email address
var_dump($result);

$result = $components->readByEMails(['alice@example.org', 'bob@example.org']); // Person objects with email addresses
var_dump($result);

报告

列出所有报告

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBReports;

$api = new API([/* … */]);
$reports = new CMDBReports($api);

$result = $reports->listReports();

var_dump($result);

获取报告的结果

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBReports;

$api = new API([/* … */]);
$reports = new CMDBReports($api);

$result = $reports->read(1);

var_dump($result);

获取一个或多个报告的结果

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBReports;

$api = new API([/* … */]);
$reports = new CMDBReports($api);

$result = $reports->batchRead([1, 2]);

var_dump($result);

从子网中获取下一个可用的 IP 地址

use Idoit\APIClient\API;
use Idoit\APIClient\Subnet;

$api = new API([/* … */]);

$subnet = new Subnet($api);
// Load subnet object by its identifier:
$nextIP = $subnet->load(123)->next();

echo 'Next IP address: ' . $nextIP . PHP_EOL;

上传文件

此 API 客户端库能够上传文件,创建一个新的 "文件" 对象并将其分配给通过其 ID 确定的现有对象

use Idoit\APIClient\API;
use Idoit\APIClient\File;

$api = new API([/* … */]);

$file = new File($api);

// Assign one file to object with identifier 100:
$file->add(100, '/path/to/file', 'my file');

// Assign many files to this object:
$file->batchAdd(
    100,
    [
        'file1.txt' => 'File 1',
        'file2.txt' => 'File 2',
        'file3.txt' => 'File 3'
    ]
);

上传图像到相册

每个对象都可以有一个由分配的分类 "图像" 提供的图像相册。这是上传图像文件并将它们分配给现有对象的方式

use Idoit\APIClient\API;
use Idoit\APIClient\Image;

$api = new API([/* … */]);

$image = new Image($api);

// Assign one image with a caption to object's gallery with identifier 100:
$image->add(100, '/path/to/flowers.jpg', 'nice picture of flowers');

// Assign many images to this object:
$file->batchAdd(
    100,
    [
        'file1.jpg' => 'JPEG file',
        'file2.png' => 'PNG file',
        'file3.bmp' => 'BMP file',
        'file3.gif' => 'Animated GIF file'
    ]
);

自定义请求

有时自己定义请求比使用此 API 客户端库提供的预定义方法更好。这里是如何执行自定义请求的

use Idoit\APIClient\API;

$api = new API([/* … */]);

$result = $api->request('idoit.version');

var_dump($result);

request() 接受方法和可选参数。

自定义批量请求

与简单请求类似,您可以根据需要执行批量请求,其中包含多个子请求

use Idoit\APIClient\API;

$api = new API([/* … */]);

$result = $api->batchRequest([
    [
        'method' => 'idoit.version'
    ],
    [
       'method' => 'cmdb.object.read',
       'params' => ['id' => 1]
    ]
]);

var_dump($result);

读取关于 CMDB 设计的信息

获取有关对象类型、组中的对象类型、分配给对象类型的分类以及分类中可用的属性的信息

use Idoit\APIClient\API;
use Idoit\APIClient\CMDBObjectTypes;
use Idoit\APIClient\CMDBObjectTypeGroups;
use Idoit\APIClient\CMDBObjectTypeCategories;
use Idoit\APIClient\CMDBCategoryInfo;

$api = new API([/* … */]);

// Object types:
$objectTypes = new CMDBObjectTypes($api);
$allObjectTypes = $objectTypes->read();
var_dump($allObjectTypes);
$server = $objectTypes->readOne('C__OBJTYPE__SERVER');
var_dump($server);
$someObjectTypes = $objectTypes->batchRead('C__OBJTYPE__SERVER', 'C__OBJTYPE__CLIENT');
var_dump($someObjectTypes);
$client = $objectTypes->readByTitle('LC__CMDB__OBJTYPE__CLIENT');
var_dump($client);

// Object types per group:
$objectTypesPerGroup = new CMDBObjectTypeGroups($api);
$objectTypes = $objectTypesPerGroup->read();
var_dump($objectTypes);

// Categories assigned to object types:
$assignedCategory = new CMDBObjectTypeCategories($api);
$serverCategories = $assignedCategory->readByConst('C__OBJTYPE__SERVER');
var_dump($serverCategories);
// Read by identifiers is also possible. And there are methods for batch requests.

// Attributes available in categories:
$categoryInfo = new CMDBCategoryInfo($api);
$modelCategory = $categoryInfo->read('C__CATG__MODEL');
var_dump($modelCategory);
$categories = $categoryInfo->batchRead([
    'C__CATG__MODEL',
    'C__CATG__FORMFACTOR',
    'C__CATS__PERSON_MASTER'
]);
var_dump($categories);

读取有关 i-doit 的信息

use Idoit\APIClient\API;
use Idoit\APIClient\Idoit;

$api = new API([/* … */]);
$idoit = new Idoit($api);

$version = $idoit->readVersion();
$constants = $idoit->readConstants();
$addOns = $idoit->getAddOns();
$license = $idoit->getLicense();

var_dump($version, $constants, $addOns, $license);

重新连接到服务器

有时您需要一个新的连接。您可以明确地从 i-doit 服务器断开连接并重新连接到它

use Idoit\APIClient\API;

$api = new API([/* … */]);

// Do your stuff…
$api->disconnect();
$api->isConnected(); // Returns false
$api->connect();
$api->isConnected(); // Returns true

调试 API 调用

对于调试目的,获取有关您的 API 调用的详细信息非常棒。此脚本使用一些有用的方法

#!/usr/bin/env php
<?php

use Idoit\APIClient\API;
use Idoit\APIClient\Idoit;

$start = time();

require_once 'vendor/autoload.php';

$api = new API([/* … */]);

// @todo Insert your code here, for example:
$request = new Idoit($api);
$request->readVersion();

fwrite(STDERR, 'Last request:' . PHP_EOL);
fwrite(STDERR, '=============' . PHP_EOL);
fwrite(STDERR, $api->getLastRequestHeaders() . PHP_EOL);
fwrite(STDERR, json_encode($api->getLastRequestContent(), JSON_PRETTY_PRINT) . PHP_EOL);
fwrite(STDERR, PHP_EOL);
fwrite(STDERR, '--------------------------------------------------------------------------------' . PHP_EOL);
fwrite(STDERR, 'Last response:' . PHP_EOL);
fwrite(STDERR, '==============' . PHP_EOL);
fwrite(STDERR, $api->getLastResponseHeaders() . PHP_EOL);
fwrite(STDERR, json_encode($api->getLastResponse(), JSON_PRETTY_PRINT) . PHP_EOL);
fwrite(STDERR, PHP_EOL);
fwrite(STDERR, '--------------------------------------------------------------------------------' . PHP_EOL);
fwrite(STDERR, 'Last connection:' . PHP_EOL);
fwrite(STDERR, '================' . PHP_EOL);
$info = $api->getLastInfo();
unset($info['request_header']);
foreach ($info as $key => $value) {
    if (is_array($value)) {
        $value = '…';
    }
    fwrite(STDERR, $key . ': ' . $value . PHP_EOL);
}
fwrite(STDERR, '--------------------------------------------------------------------------------' . PHP_EOL);
fwrite(STDERR, 'Amount of requests: ' . $api->countRequests() . PHP_EOL);
$memoryUsage = memory_get_peak_usage(true);
fwrite(STDERR, sprintf('Memory usage: %s bytes', $memoryUsage) . PHP_EOL);
$duration = time() - $start;
fwrite(STDERR, sprintf('Duration: %s seconds', $duration) . PHP_EOL);

贡献

请向 我们的问题跟踪器 报告任何问题。拉取请求非常受欢迎。如果您想参与其中,请参阅文件 CONTRIBUTING.md 以获取详细信息。

使用此 API 客户端库的项目

发送拉取请求添加您自己的。

版权 & 许可证

版权所有 (C) 2022 synetics GmbH

版权所有 (C) 2016-2022 Benjamin Heisig

本软件受GNU Affero GPL版本3或更高版本(AGPLv3+)许可。这是一款自由软件:您可以自由更改和重新分发它。在法律允许的范围内,不提供任何保证。