为什么 Analytics Data API V1 Beta 不符合 REST 规范?
Why does Analytics Data API V1 Beta not conform to the REST spec?
我正在将 GTM 和 GA4 添加到一些网站应用程序中,这些应用程序需要生成每个广告客户的广告点击率的详细统计信息。
这在标准 GA 报告中看起来不可行,因此我使用 PHP Analytics Data API V1 Beta 的实施。由于使用 PHP 的 V1 报告的示例很少(例如 analyticsdata/quickstart.php),我正在翻译来自 REST API 的其他 classes 和操作数' s JSON .
<?php
namespace Google\Analytics\Data\V1beta;
require 'vendor/autoload.php';
$property_id = '<redacted>';
putenv('GOOGLE_APPLICATION_CREDENTIALS=Keyfile.json');
$client = new BetaAnalyticsDataClient();
// Make an API call.
$response = $client->runReport([
'property' => 'properties/' . $property_id,
'dateRanges' => [
new DateRange([
'start_date' => '2021-04-01',
'end_date' => 'today',
]
),
],
'dimensions' => [new Dimension(
[
'name' => 'customEvent:link_classes'
]
),
],
'dimensionFilter'=>[new FilterExpression(
[
'filter'=>[new Filter(
[
'field_name' => 'customEvent:Classes',
'string_filter' => [new Filter\StringFilter(
[
'match_type'=> '1',
'value'=> 'AdvertA',
'case_sensitive'=> false
])]])]])],
'metrics' => [new Metric(
[
'name' => 'eventCount',
]
)
]
]);
etc
Quickstart 示例可以运行,但在添加 dimensionFilter 时会遇到无穷无尽的麻烦。
例如,match_type 应该是几个字符串(EXACT、CONTAINS 等)之一的枚举。 match_type 的 JSON 定义仅显示字符串(枚举 'members')而不显示任何关联值(通常是整数)。 GA4 迁移指南有一个示例
"matchType": "BEGINS_WITH"
PHP 没有“枚举”,但等效于 select 一个字符串并将其分配给 match_type(见上文)。错误:StringFilter 失败,除非给它一个整数操作数,大概是枚举匹配字符串中所需匹配的序号(第一个是 0 还是 1?)。我对 JSON 模式的理解是 'enum' 列表只是将结果限制为唯一操作数之一,并可选择检查操作数类型。 (相比之下,Python 枚举函数 returns 包含一个对列表的对象,其中操作数的序号位于操作数之前)。
自定义尺寸 似乎不符合 API 的 JSON。在 Analytics 中,我指定了一个自定义维度,维度名称为 类,用户 Property/Parameter 为 link_classes**。
但是...在 API 中,维度名称必须是 customEvent:link_classes 而不是 customEvent:Classes。否则它会以“Field customEvent:Classes is not a valid dimension”而失败
在过滤器表达式中的过滤器中定义 field_name 时也会发生这种情况。
那么 API 维度名称不是 Analytics 维度名称的名称,而是 Analytics 描述性名称的 Property/Parameter 吗?在一个地方,我读到后者:“自定义维度在 API 报告请求中由维度的 参数名称 和范围 指定。 “但在其他地方暗示 Name 是维度名称,例如/devguides/reporting/data/v1/advanced:
"维度": [{ "名称": "customUser:last_level" }]
最后,即使与开发人员实现的一致,dimensionFilter 也落在了“Expect Google\Analytics\Data\V1beta\Filter\StringFilter”
它是 Beta 代码,但不会与 REST 规范有明显的偏差,所以也许我错误地阅读了规范。还有其他人有这个问题吗?
** GTM 有一个“点击 - 仅链接”触发器,其中“点击 URL”“包含”广告商的 URL。 API 维度过滤器中的 类 自定义维度具有广告点击链接的 class 值。
为了回答你问题的第一部分,我相信在 PHP 中使用枚举的正确方法是:
'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH
关于第二个问题。根据 the API schema documentation,自定义维度的名称构造为 customEvent:parameter_name
(对于事件范围的维度)和 customUser:parameter_name
(对于用户范围的维度)。
正如您正确指出的那样,parameter_name
不是描述性名称,而是事件参数名称。在您的示例中,您似乎正在使用用户范围的维度,因此 API 中的维度名称应为 customUser:link_classes
.
这是一个看起来 运行 不错的完整示例:
require 'vendor/autoload.php';
use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\FilterExpression;
use Google\Analytics\Data\V1beta\Filter;
use Google\Analytics\Data\V1beta\Metric;
/**
* TODO(developer): Replace this variable with your Google Analytics 4
* property ID before running the sample.
*/
$property_id = 'YOUR-GA4-PROPERTY-ID';
$client = new BetaAnalyticsDataClient();
// Make an API call.
$response = $client->runReport([
'property' => 'properties/' . $property_id,
'dateRanges' => [
new DateRange([
'start_date' => '2020-03-31',
'end_date' => 'today',
]),
],
'dimensions' => [new Dimension(
[
'name' => 'customUser:link_classes'
]),
],
'dimensionFilter' => new FilterExpression(
[
'filter' => new Filter(
[
'field_name' => 'customUser:link_classes',
'string_filter' => new Filter\StringFilter(
[
'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH,
'value' => 'AdvertA',
'case_sensitive' => false
]
)
])
]),
'metrics' => [new Metric(
[
'name' => 'eventCount',
]
)
]
]);
非常感谢 Ilya 的最有用、最及时和最正确的回复。
三分:
1.
使用
'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH
而不是:
'match_type' => ‘BEGINS_WITH’
修复了“Uncaught Exception: Expect integer.在 /vendor/google/protobuf/src/Google/Protobuf/Internal/GPBUtil.php” 作为
MatchType::BEGINS_WITH (etc) 常量 returns 来自 class MatchType.
的整数(在本例中为 2)
2.
如果在自定义维度文档中使用维度名称的地方添加提示,则可以防止错误,例如
/devguides/reporting/data/v1/advanced: "维度": [{ "名称": "自定义用户:last_level" }]
强调该名称不是为 Analytics 定义的维度名称,而是关联的用户 Property/Parameter 名称。或者 GA 的自定义维度 'form' 中的名称标题应该修改。
3.
最后,dimensionFilter 落在
‘Expect Google\Analytics\Data\V1beta\Filter\StringFilter’
错误消息是由于我在实例化 FilterExpression、Filter 和 StringFilter 时的愚蠢行为,就好像它们是数组元素一样,
例如
'string_filter' => [new Filter\StringFilter(
而不是
'string_filter' => new Filter\StringFilter(
不幸的是,当不小心遵循示例报告代码时很容易犯错误,其中 dateRanges、维度等正确定义数组(因为它们可以采用多个日期范围和维度),例如
'dimensions' => [new Dimension (
我正在将 GTM 和 GA4 添加到一些网站应用程序中,这些应用程序需要生成每个广告客户的广告点击率的详细统计信息。 这在标准 GA 报告中看起来不可行,因此我使用 PHP Analytics Data API V1 Beta 的实施。由于使用 PHP 的 V1 报告的示例很少(例如 analyticsdata/quickstart.php),我正在翻译来自 REST API 的其他 classes 和操作数' s JSON .
<?php
namespace Google\Analytics\Data\V1beta;
require 'vendor/autoload.php';
$property_id = '<redacted>';
putenv('GOOGLE_APPLICATION_CREDENTIALS=Keyfile.json');
$client = new BetaAnalyticsDataClient();
// Make an API call.
$response = $client->runReport([
'property' => 'properties/' . $property_id,
'dateRanges' => [
new DateRange([
'start_date' => '2021-04-01',
'end_date' => 'today',
]
),
],
'dimensions' => [new Dimension(
[
'name' => 'customEvent:link_classes'
]
),
],
'dimensionFilter'=>[new FilterExpression(
[
'filter'=>[new Filter(
[
'field_name' => 'customEvent:Classes',
'string_filter' => [new Filter\StringFilter(
[
'match_type'=> '1',
'value'=> 'AdvertA',
'case_sensitive'=> false
])]])]])],
'metrics' => [new Metric(
[
'name' => 'eventCount',
]
)
]
]);
etc
Quickstart 示例可以运行,但在添加 dimensionFilter 时会遇到无穷无尽的麻烦。 例如,match_type 应该是几个字符串(EXACT、CONTAINS 等)之一的枚举。 match_type 的 JSON 定义仅显示字符串(枚举 'members')而不显示任何关联值(通常是整数)。 GA4 迁移指南有一个示例
"matchType": "BEGINS_WITH"
PHP 没有“枚举”,但等效于 select 一个字符串并将其分配给 match_type(见上文)。错误:StringFilter 失败,除非给它一个整数操作数,大概是枚举匹配字符串中所需匹配的序号(第一个是 0 还是 1?)。我对 JSON 模式的理解是 'enum' 列表只是将结果限制为唯一操作数之一,并可选择检查操作数类型。 (相比之下,Python 枚举函数 returns 包含一个对列表的对象,其中操作数的序号位于操作数之前)。
自定义尺寸 似乎不符合 API 的 JSON。在 Analytics 中,我指定了一个自定义维度,维度名称为 类,用户 Property/Parameter 为 link_classes**。 但是...在 API 中,维度名称必须是 customEvent:link_classes 而不是 customEvent:Classes。否则它会以“Field customEvent:Classes is not a valid dimension”而失败 在过滤器表达式中的过滤器中定义 field_name 时也会发生这种情况。 那么 API 维度名称不是 Analytics 维度名称的名称,而是 Analytics 描述性名称的 Property/Parameter 吗?在一个地方,我读到后者:“自定义维度在 API 报告请求中由维度的 参数名称 和范围 指定。 “但在其他地方暗示 Name 是维度名称,例如/devguides/reporting/data/v1/advanced: "维度": [{ "名称": "customUser:last_level" }]
最后,即使与开发人员实现的一致,dimensionFilter 也落在了“Expect Google\Analytics\Data\V1beta\Filter\StringFilter”
它是 Beta 代码,但不会与 REST 规范有明显的偏差,所以也许我错误地阅读了规范。还有其他人有这个问题吗?
** GTM 有一个“点击 - 仅链接”触发器,其中“点击 URL”“包含”广告商的 URL。 API 维度过滤器中的 类 自定义维度具有广告点击链接的 class 值。
为了回答你问题的第一部分,我相信在 PHP 中使用枚举的正确方法是:
'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH
关于第二个问题。根据 the API schema documentation,自定义维度的名称构造为 customEvent:parameter_name
(对于事件范围的维度)和 customUser:parameter_name
(对于用户范围的维度)。
正如您正确指出的那样,parameter_name
不是描述性名称,而是事件参数名称。在您的示例中,您似乎正在使用用户范围的维度,因此 API 中的维度名称应为 customUser:link_classes
.
这是一个看起来 运行 不错的完整示例:
require 'vendor/autoload.php';
use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\FilterExpression;
use Google\Analytics\Data\V1beta\Filter;
use Google\Analytics\Data\V1beta\Metric;
/**
* TODO(developer): Replace this variable with your Google Analytics 4
* property ID before running the sample.
*/
$property_id = 'YOUR-GA4-PROPERTY-ID';
$client = new BetaAnalyticsDataClient();
// Make an API call.
$response = $client->runReport([
'property' => 'properties/' . $property_id,
'dateRanges' => [
new DateRange([
'start_date' => '2020-03-31',
'end_date' => 'today',
]),
],
'dimensions' => [new Dimension(
[
'name' => 'customUser:link_classes'
]),
],
'dimensionFilter' => new FilterExpression(
[
'filter' => new Filter(
[
'field_name' => 'customUser:link_classes',
'string_filter' => new Filter\StringFilter(
[
'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH,
'value' => 'AdvertA',
'case_sensitive' => false
]
)
])
]),
'metrics' => [new Metric(
[
'name' => 'eventCount',
]
)
]
]);
非常感谢 Ilya 的最有用、最及时和最正确的回复。 三分:
1. 使用
'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH
而不是:
'match_type' => ‘BEGINS_WITH’
修复了“Uncaught Exception: Expect integer.在 /vendor/google/protobuf/src/Google/Protobuf/Internal/GPBUtil.php” 作为 MatchType::BEGINS_WITH (etc) 常量 returns 来自 class MatchType.
的整数(在本例中为 2)2. 如果在自定义维度文档中使用维度名称的地方添加提示,则可以防止错误,例如 /devguides/reporting/data/v1/advanced: "维度": [{ "名称": "自定义用户:last_level" }] 强调该名称不是为 Analytics 定义的维度名称,而是关联的用户 Property/Parameter 名称。或者 GA 的自定义维度 'form' 中的名称标题应该修改。
3. 最后,dimensionFilter 落在
‘Expect Google\Analytics\Data\V1beta\Filter\StringFilter’
错误消息是由于我在实例化 FilterExpression、Filter 和 StringFilter 时的愚蠢行为,就好像它们是数组元素一样, 例如
'string_filter' => [new Filter\StringFilter(
而不是
'string_filter' => new Filter\StringFilter(
不幸的是,当不小心遵循示例报告代码时很容易犯错误,其中 dateRanges、维度等正确定义数组(因为它们可以采用多个日期范围和维度),例如
'dimensions' => [new Dimension (