暴露API方法

方法中公开新的API方法HTTP报表API通过创建API模块。Reporting API允许第三方应用程序通过HTTP请求访问分析数据并操作其他数据(如用户或网站)。

它有什么好处?

Matomo UI使用Reporting API来呈现报表、管理用户等。如果您想向Matomo UI添加一个特性,您可能必须在API中公开一个方法来访问这些数据。由于API是通过HTTP调用的,它允许您从任何地方获取或操作任何与Matomo相关的数据。在这些公开的API方法中,你基本上可以做任何你想做的事情,例如:

  • 使用其他数据增强现有报告
  • 根据自定义规则筛选现有报表
  • 访问数据库并生成自定义报告
  • 持久化并读取任何数据
  • 请求服务器信息

添加新的API模块

要创建一个新的API,请使用Matomo控制台

。/控制台生成:api

该命令将要求您输入创建的API应该属于的插件的名称。现在应该有一个文件插件/编写MyPlugin / API.php用一些简单的例子让你开始:

类API扩展\Piwik\Plugin\API{公共函数getAnswerToLife(bool $truth = true): int {if ($truth){返回42;}返回24;}公共函数getExampleReport(string $idSite, string $period, string $date, bool $wonderful = false):数据表{$table =数据表::makeFromSimpleArray(array(array('label' => 'My label 1', ' nb_出访' => '1'),array('label' => 'My label 2', ' nb_出访' => '5'),);返回$表;}}

该文件中的任何公共方法都可以通过Reporting API使用。比如这个方法getAnswerToLife可以通过这个URL调用:= api方法= MyApiPlugin.getAnswerToLife index . php ?模块.URL参数方法是这个类中的插件名称和方法名称的组合。

向方法传递参数

两个示例方法都定义了一些参数。要将任何值传递给方法的参数,只需在URL中通过名称指定它们。例如…和方法= MyApiPlugin.getExampleReport&idSite = 1期= week&date = today&wonderful = 1将值传递给方法的参数getExampleReport

类型处理/类型提示

可以为API方法的参数定义类型提示。如果参数有类型提示,我们的API请求处理器将自动检查所提供的值是否与期望的类型兼容。如果类型不匹配,API将返回相应的错误消息。

API参数通常以URL或请求参数的形式提供,只支持以下类型提示:字符串int浮动保龄球数组.boolean参数将通过匹配自动转换0' 0 '“假”而且1' 1 '“真正的”

如果你的API方法能够为一个参数处理多种类型,你可以不定义类型提示。然后,参数将作为字符串或字符串数组传递(取决于请求参数)。这时需要手动验证和检查参数值。

参数消毒

从早期开始,Matomo自动清除传递给API方法的所有参数常见的::sanitizeInputValues.这样就可以使用所有输入参数,而不需要过多考虑安全性,因为有风险的内容会自动转义。在Matomo 5中,我们开始弃用这种自动消毒。至少在Matomo 6之前,所有API参数仍将被自动清除。但是现在有可能对某些API类甚至单个API方法禁用这种行为。

要禁用整个API类的自动消毒,只需设置API类的属性autoSanitizeInputParams美元

类API扩展\Piwik\Plugin\API {protected $autoSanitizeInputParams = false;

若要仅为单个API方法禁用它,需要添加@unsanitized到方法文档块:

/** * API方法描述* @参数int $idSite * @未消毒*/公共函数getSomething(int $idSite) {

注意:当使用type的未消毒参数时字符串数组,请确保小心使用这些值。由于它们可能包含可能破坏HTML或SQL语法的内容,请确保在使用时正确地转义这些值。

返回一个值

在API方法中,您可以返回任何布尔值、数字、字符串或数组值。资源或对象不能返回,除非它实现DataTableInterface,例如数据表(Matomo中用于存储分析数据的主要数据结构),DataTable \地图(存储一组数据表)和DataTable \简单(一个数据表,其中每行有两列:标签和值)。

你知道吗?您可以通过附加参数来选择API请求的响应格式CSV格式= JSON XML | | |……到URL。请查看报告API参考获取更多信息。

数据表vs数组

方法中直接返回数组,您可能想知道getExampleReport例子吗?通过用数据表包装它,您将能够使用许多特性,如filter_offsetfilter_limitfilter_sort_columnshowColumns还有更多。

最佳实践

检查用户权限

不要忘记检查用户是否实际具有访问数据或执行操作的权限。如果你不熟悉Matomo的权限和如何检查他们阅读我们用户权限指南。

保持API方法小

在Matomo,我们的目标是编写干净的代码。因此,我们建议保持API方法较小(关注点分离)。一个API基本上就像一个控制器:

public函数createLdapUser(int $idSite,字符串$login,字符串$password) {Piwik::checkUserHasAdminAccess($idSite);美元$ this - > checkLogin(登录);美元$ this - > checkPassword(密码);$myModel = new LdapModel();$success = $myModel->createUser($idSite, $login, $password);美元返回成功;}

这不仅易于阅读,还允许您为其创建简单的测试LdapModel(无需引导整个Matomo层),如果需要,您将能够在其他地方重用它。

调用其他插件的api

例如,你想从另一个插件获取一个现有的报告——比如所有Page url的列表,不要直接调用该方法来请求这个报告:\Piwik\Plugins\Actions\API::getInstance()->getPageUrls($idSite, $period, $date);.相反,发出一个新的API请求:

$report = \Piwik\API\Request::processRequest('操作。getPageUrls', array('idSite' => $idSite, 'period' => $period, 'date' => $date,));

这有几个优点:

  • 如果请求的插件在Matomo安装中不可用,它可以避免致命错误
  • 其他插件可以扩展被调用的API方法via事件(向报表中添加额外的报表数据,执行额外的权限检查),但这些事件仅在按建议请求报表时才会触发
  • 如果方法签名改变了,您的请求很可能仍然可以工作
Baidu