GoogleAPIPHP客户端readMask使用详解
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习文章相关编程知识。下面本篇文章就来带大家聊聊《Google API PHP客户端readMask使用教程》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

Google My Business Business Information API 概述
Google My Business Business Information API 是 Google 提供的用于管理 Google 商家资料的最新接口。它允许开发者以编程方式访问和更新商家信息,包括地点详情、营业时间、照片、评论等。相较于旧版的 Google My Business API (v4),新版 API 提供了更细粒度的控制和更清晰的资源结构。
在使用 PHP 客户端库与此 API 交互时,通常会涉及以下几个核心步骤:
- 初始化 Google 客户端并进行认证。
- 获取账户管理服务实例 (Google_Service_MyBusinessAccountManagement) 以列出和选择商家账户。
- 获取商家信息服务实例 (Google_Service_MyBusinessBusinessInformation) 以操作地点(Location)资源。
- 调用相应的方法,例如 accounts_locations->listAccountsLocations() 来获取账户下的地点列表。
readMask 参数解析与常见错误
在调用 API 获取资源列表或详情时,readMask 是一个非常重要的参数。它允许您指定 API 响应中应包含的资源字段,从而实现“部分响应”(Partial Response)。这是一种优化策略,可以显著减少传输的数据量,提高 API 调用的效率。
然而,readMask 的使用不当是导致 INVALID_ARGUMENT 错误的一个常见原因。当您尝试使用 Google_Service_MyBusinessBusinessInformation 服务的 accounts_locations->listAccountsLocations() 方法获取地点列表时,如果 readMask 参数中包含了不属于 Location 资源本身的字段,API 将返回 HTTP 400 Bad Request 错误,并附带 INVALID_ARGUMENT 状态码及 Invalid field mask provided 的详细信息。
错误示例分析: 例如,尝试使用 readMask 指定 user.display_name,photo:
{
"error": {
"code": 400,
"message": "Request contains an invalid argument.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "read_mask",
"description": "Invalid field mask provided"
}
]
}
]
}
}这个错误发生的原因是 user.display_name 和 photo 并非 Location 资源直接拥有的属性。readMask 必须指向 Location 资源(或其嵌套子资源)中定义的有效字段。例如,地点名称 (name)、标题 (title)、网站 URI (websiteUri)、地址 (address)、经纬度 (latlng) 等才是 Location 资源的合法属性。
readMask 的正确用法
要正确使用 readMask,您必须查阅 Google My Business Business Information API 的官方文档,特别是关于 Location 资源的定义。该文档会列出所有可用的字段及其类型。
正确的 readMask 应包含以下类型的字段:
- 顶级字段: 如 name (地点资源名称), title (商家标题), websiteUri (网站URI), languageCode 等。
- 嵌套字段: 如果某个字段本身是一个对象,您可以指定其子字段,例如 address.regionCode, address.locality, latlng.latitude, latlng.longitude。
示例: 如果您想获取地点的名称、标题、网站 URI 和地址信息,您的 readMask 可以是: name,title,websiteUri,address.regionCode,address.locality,address.postalCode,address.addressLines
PHP 客户端示例:正确获取地点列表
以下是一个使用 PHP 客户端库正确获取 Google My Business 地点列表的示例代码,其中包含了 readMask 的正确用法和基本的错误处理:
setApplicationName('My Business API Locations Example');
// 假设你使用服务账户认证
// 请替换为你的服务账户凭据文件路径
$client->setAuthConfig('path/to/your/service_account_credentials.json');
// 或者使用 OAuth 2.0 认证流程
// $client->setRedirectUri('YOUR_REDIRECT_URI');
// $client->setAccessToken('YOUR_ACCESS_TOKEN'); // 或使用刷新令牌获取新令牌
// 设置必要的 API 作用域
$client->setScopes([
'https://www.googleapis.com/auth/business.manage' // 管理商家资料的权限
]);
return $client;
}
try {
$client = getGoogleClient();
// 1. 获取账户管理服务实例
$my_business_account = new Google_Service_MyBusinessAccountManagement($client);
// 2. 列出账户
$list_accounts_response = $my_business_account->accounts->listAccounts();
// 检查是否有账户,并选择第一个账户进行操作
$accounts = $list_accounts_response->getAccounts();
if (empty($accounts)) {
echo "未找到任何Google My Business账户。\n";
exit;
}
$account = $accounts[0]; // 获取第一个账户
echo "正在处理账户: " . $account->getName() . " (显示名称: " . $account->getDisplayName() . ")\n";
// 3. 获取Business Information服务实例
$mybusinessService = new Google_Service_MyBusinessBusinessInformation($client);
// 4. 准备查询参数
$queryParams = [
"pageSize" => 10, // 每页获取10个地点
// 关键点:readMask 必须指定 Location 资源的有效属性。
// 这些属性可以在 Google My Business Business Information API 的 Location 资源文档中找到。
// 错误示例:'user.display_name,photo'
// 正确示例:
'readMask' => "name,title,websiteUri,address,latlng,primaryCategory.displayName"
// 更多可选字段:phoneNumbers, storefrontHours, regularHours, specialHours, serviceArea, labels, relations, moreHours, metadata, profile, serviceItems, attributes 等
];
// 5. 列出账户下的地点
// accounts_locations 是 Google_Service_MyBusinessBusinessInformation 服务下的 Locations 集合
$locationsList = $mybusinessService->accounts_locations->listAccountsLocations($account->name, $queryParams);
// 6. 处理返回的地点数据
$locations = $locationsList->getLocations();
if (!empty($locations)) {
echo "成功获取地点列表:\n";
foreach ($locations as $location) {
echo "--------------------\n";
echo " 地点名称: " . $location->getName() . "\n";
echo " 地点标题: " . $location->getTitle() . "\n";
if ($location->getWebsiteUri()) {
echo " 网站URI: " . $location->getWebsiteUri() . "\n";
}
if ($location->getAddress()) {
$address = $location->getAddress();
echo " 地址: " . implode(", ", $address->getAddressLines()) . ", "
. $address->getLocality() . ", " . $address->getRegionCode() . " " . $address->getPostalCode() . "\n";
}
if ($location->getLatlng()) {
$latlng = $location->getLatlng();
echo " 经纬度: " . $latlng->getLatitude() . ", " . $latlng->getLongitude() . "\n";
}
if ($location->getPrimaryCategory()) {
echo " 主类别: " . $location->getPrimaryCategory()->getDisplayName() . "\n";
}
// 访问其他通过 readMask 请求的字段
}
echo "--------------------\n";
// 如果有下一页,可以继续获取
if ($locationsList->getNextPageToken()) {
echo "存在更多地点,下一页令牌: " . $locationsList->getNextPageToken() . "\n";
// 您可以在此处添加逻辑以获取下一页数据
}
} else {
echo "该账户下未找到任何地点。\n";
}
} catch (Google\Service\Exception $e) {
// 捕获 Google API 服务的特定异常
echo "API调用失败: " . $e->getMessage() . "\n";
$errors = $e->getErrors();
if (!empty($errors)) {
foreach ($errors as $error) {
echo "错误详情: " . ($error['message'] ?? 'N/A') . "\n";
echo "错误状态: " . ($error['status'] ?? 'N/A') . "\n";
if (isset($error['details'][0]['fieldViolations'])) {
foreach ($error['details'][0]['fieldViolations'] as $violation) {
echo "字段违规: " . ($violation['field'] ?? 'N/A') . " - " . ($violation['description'] ?? 'N/A') . "\n";
}
}
}
}
} catch (Exception $e) {
// 捕获其他通用异常
echo "发生未知错误: " . $e->getMessage() . "\n";
}
?>注意事项与最佳实践
- 查阅官方文档: 始终以 Google My Business Business Information API 的官方文档作为 readMask 字段的最终参考。Location 资源的详细定义将明确指出所有可用的字段。
- 精确指定字段: 只请求您实际需要的字段。这不仅可以避免 INVALID_ARGUMENT 错误,还能减少网络传输量和 API 响应处理时间,提高应用程序性能。
- 错误处理: 实现健壮的错误处理机制。捕获 Google\Service\Exception 可以帮助您识别 API 返回的特定错误(如 400 Bad Request),并根据错误详情进行调试。
- 认证与授权: 确保您的 Google 客户端已正确配置了认证凭据(如 OAuth 2.0 凭据或服务账户)和必要的 API 作用域(例如 https://www.googleapis.com/auth/business.manage)。权限不足也会导致 API 调用失败。
- 分页处理: 当地点数量较多时,API 响应会进行分页。利用 pageSize 和 nextPageToken 参数来循环获取所有地点数据。
总结
正确理解和使用 readMask 参数是有效利用 Google My Business Business Information API 的关键。通过确保 readMask 中指定的字段与目标资源(如 Location)的实际属性相符,可以避免常见的 INVALID_ARGUMENT 错误,并实现高效、精准的数据获取。开发者在集成 API 时,务必仔细查阅官方文档,以确保参数的正确性。
本篇关于《GoogleAPIPHP客户端readMask使用详解》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!
Golang享元模式:对象池与缓存实战解析
- 上一篇
- Golang享元模式:对象池与缓存实战解析
- 下一篇
- Win11触控优化技巧大全
-
- 文章 · php教程 | 5小时前 | 后端开发 · php教程 · php filter_var FILTER_VALIDATE_BOOLEAN FILTER_NULL_ON_FAILURE 布尔验证
- PHP filter_var 怎么区分验证失败和合法的 false
- 428浏览 收藏
-
- 文章 · php教程 | 9小时前 |
- PHP ini_parse_quantity 怎么解析内存大小配置值
- 338浏览 收藏
-
- 文章 · php教程 | 11小时前 |
- PHP Randomizer::pickArrayKeys 怎么无重复抽样键名
- 397浏览 收藏
-
- 文章 · php教程 | 13小时前 |
- PHP match 为什么使用严格比较
- 414浏览 收藏
-
- 文章 · php教程 | 16小时前 | 数据结构 · php教程 · php SplPriorityQueue FIFO 稳定优先队列
- PHP SplPriorityQueue 相同优先级元素顺序怎么控制
- 441浏览 收藏
-
- 文章 · php教程 | 18小时前 | 性能优化 · session · php教程 · php session.lazy_write 会话文件 SessionHandler
- PHP session.lazy_write 为什么能减少会话文件写入
- 139浏览 收藏
-
- 文章 · php教程 | 20小时前 | 闭包 · php教程 · php Closure::bindTo 闭包作用域
- PHP Closure::bindTo 怎么切换对象与类作用域
- 413浏览 收藏
-
- 文章 · php教程 | 23小时前 | PHP · php 闭包 filter_var 输入过滤 FILTER_CALLBACK
- PHP filter_var 回调过滤器怎么传入额外选项
- 202浏览 收藏
-
- 文章 · php教程 | 1天前 |
- PHP PDO::FETCH_KEY_PAIR 怎么构造键值映射
- 346浏览 收藏
-
- 文章 · php教程 | 1天前 | JSON · 异常处理 · PHP · 接口调试 · php json_decode JSON_THROW_ON_ERROR JsonException JSON错误处理
- PHP json_decode 怎么用 JSON_THROW_ON_ERROR 保留错误上下文
- 471浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 343次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 398次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 393次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 356次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 182次使用
-
- PHP JSON_THROW_ON_ERROR 抛错后怎么保留原始字段位置
- 2026-09-09 501浏览
-
- PHP 8.5 array_last() 怎么处理空数组:从 null 结果到兼容旧版本的 Polyfill
- 2026-08-16 501浏览
-
- 宝塔配置Ruby环境:RVM+Nginx反代教程
- 2026-05-29 501浏览
-
- unset函数作用范围详解
- 2026-05-29 501浏览
-
- VS Code配置Xdebug教程:PHP调试技巧全解析
- 2026-05-13 501浏览

