Google My Business API:PHP客户端正确使用readMask获取地点列表

Google My Business API:PHP客户端正确使用readMask获取地点列表

本教程旨在解决使用Google My Business Business Information API PHP客户端获取地点列表时,因readMask参数格式不正确导致的INVALID_ARGUMENT错误。文章将详细解释readMask字段的正确用法,指出其应指定地点资源的有效属性,而非用户或照片相关字段。通过具体代码示例,帮助开发者顺利获取所需的地点信息,避免常见的API调用陷阱。

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 资源的合法属性。

立即学习“PHP免费学习笔记(深入)”;

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 (GoogleServiceException $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 响应处理时间,提高应用程序性能。错误处理: 实现健壮的错误处理机制。捕获 GoogleServiceException 可以帮助您识别 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 时,务必仔细查阅官方文档,以确保参数的正确性。

以上就是Google My Business API:PHP客户端正确使用readMask获取地点列表的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/161357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月5日 20:35:46
下一篇 2025年12月2日 05:36:55

相关推荐

  • 如何使用spryker/authorization-extension优化Spryker项目的权限管理?

    可以通过一下地址学习composer:学习地址 在大型电商或企业级应用开发中,尤其是在像 spryker 这样的模块化框架下,管理不同用户角色对系统资源的访问权限,常常是一个令人头疼的问题。 想象一下,你正在开发一个 Spryker 电商平台,需要为后台管理系统设计一套精细的权限控制。不同的管理员(…

    开发工具 2025年12月5日
    000
  • 当科技装上运动的翅膀,AcerDay 2025宏碁玩出新花样

    每年盛夏,acerday 总是以青春、科技与潮流的多元融合点燃科技圈的激情脉动。2025年,acerday 以“破界无惧”为核心理念,联合阿迪达斯京东自营旗舰店,开启一场围绕“运动×科技”的重磅跨界合作。在英特尔酷睿平台的强力支持下,这场联动打破常规、重塑边界,激励年轻一代勇敢突破自我,尽情释放内在…

    2025年12月5日 行业动态
    000
  • Java中HTTPS怎么实现 掌握SSL证书的配置方法

    在java中实现https需配置ssl证书并使用httpsurlconnection类。具体步骤包括:1.获取ssl证书,可从ca购买、使用自签名证书或通过云服务商获取;2.配置ssl证书,将证书导入keystore并设置系统属性;3.使用httpsurlconnection建立连接;4.处理自签名…

    2025年12月5日 java
    000
  • 如何解决电商产品数据管理混乱的问题,使用Spryker/Product模块可以高效构建产品体系

    可以通过一下地址学习composer:学习地址 在电商领域深耕多年的开发者们,想必都对产品数据管理带来的“甜蜜负担”深有体会。想象一下,一个拥有成千上万种商品的电商平台,每件商品都有其独特的属性、变体(sku)、价格、库存信息,并且还需要与外部的产品信息管理(pim)系统进行数据同步。这其中涉及到的…

    开发工具 2025年12月5日
    000
  • 访问控制过滤器(ACF)的使用场景

    acf在web应用和微服务架构中用于控制用户和服务的访问权限。1)在web应用中,acf通过定义url路径和角色来管理权限,如spring boot中的securityconfig类。2)在微服务架构中,acf通过服务网关和oauth2/jwt实现服务间安全通信,如spring cloud中的gat…

    2025年12月5日
    000
  • 2025上半年中央空调数据报告:海尔3大领域第一份额

    8月4日,2025年上半年中央空调市场数据报告正式出炉。报告显示,在能源结构转型与原材料价格频繁波动的双重影响下,行业整体面临较大压力。然而,随着全产业加速向节能方向聚焦,企业在技术研发、产品升级和市场布局方面不断加码,释放出三大积极信号,为行业发展注入新动能,展现出巨大的增长潜力。 在高端离心机、…

    2025年12月5日
    100
  • 告别订单管理混乱:如何利用Composer引入SprykerOMS打造高效订单流程

    可以通过一下地址学习composer:学习地址 订单管理的痛点:我曾被“状态”所困 作为一名开发者,我深知构建一个稳定、高效的电商系统有多么不易。其中,订单管理模块无疑是最核心也最复杂的环节之一。想象一下:用户下单、支付、仓库发货、物流配送、用户签收,这还只是一个顺利的流程。如果遇到支付失败、用户取…

    开发工具 2025年12月5日
    000
  • 如何安装和配置Workerman环境?

    选择workerman是因为它是高性能的php应用服务器,支持长连接、websocket、mqtt等,适合实时应用和高并发场景。安装和配置步骤包括:1.安装php:sudo apt-get update && sudo apt-get install php;2.安装composer…

    2025年12月5日
    000
  • 星尘数据推出首款专注数据价值发现的产品 MorningStar

    3 月 11 日,国际领先的 ai 数据技术公司星尘数据(stardust ai)在北京举办 2024 年春季产品发布会,重磅推出 morningstar,一款面向 ai 的数据闭环产品。morningstar 是首款专注数据价值发现的 ai 数据平台,相较于传统的数据管理工具,这款理念先进、操作便…

    2025年12月5日 硬件教程
    000
  • js如何生成散点图 使用D3.js绘制数据散点图

    如何用d3.js创建散点图并添加工具提示和样式?首先准备数据,如对象数组包含x和y值;接着创建svg元素并设置宽高;然后定义x和y轴的比例尺,将数据映射到屏幕坐标;随后绑定数据并绘制圆圈;再添加坐标轴提升可读性;要添加工具提示,需创建div并监听mouseover、mousemove、mouseou…

    2025年12月5日 web前端
    000
  • 心智营销进入BMS时代:巨量引擎发布全新一代品牌心智营销解决方案

    2025年8月8日,巨量引擎在上海隆重举办mindsight品牌心智营销发布会,邀请来自各行业的品牌代表、代理机构及生态合作伙伴齐聚一堂,共同见证「bms全新一代品牌心智营销解决方案」的正式亮相。bms(brandmindsightsolution)整合巨量云图、巨量星图与品牌广告营销能力,围绕“明…

    2025年12月5日 行业动态
    000
  • 《NBA®2K26 标准版》揭晓封面运动员

    nba 2k26的提前试玩将在8月29日启动,比原定于2025年9月5日的全球发售日期提前一周。 Nintendo Switch™2将推出次世代版本。 根据2K官方公布的消息,三届全明星、俄克拉荷马雷霆队的当家控卫Shai Gilgeous Alexander,作为2024-25赛季常规赛MVP及N…

    2025年12月5日
    000
  • Cadence UCIe IP 在 Samsung Foundry 的 5nm 汽车工艺上实现流片成功

    cadence 基于ucie™标准的封装ip在三星5nm汽车工艺上成功完成首次流片,标志着cadence持续致力于提供满足新一代汽车电子和高性能计算应用严格要求的高性能车规级ip解决方案。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Ca…

    2025年12月5日 科技
    000
  • 优化Google My Business API:解决accounts.locations.list中readMask参数的INVALID_ARGUMENT错误

    本教程详细探讨了在使用Google My Business Business Information API的accounts.locations.list方法时,因readMask参数格式不正确导致的INVALID_ARGUMENT错误。文章将阐明readMask应如何正确指定Location资源…

    2025年12月5日
    000
  • linux系统下fcntl函数解析与标准IO函数介绍

    —–今天是最后一篇文章关于linux系统下文件io操作了,从明天起开始写文件属性的文章了,欢迎大家来学习,一起进步。(同时也欢迎大家批评指出错误,我会及时纠正过来的)。 一、fcntl函数解析: 1、函数原型:先用man手册来查看fcntl的用法和原型: int fcntl(…

    2025年12月5日 运维
    000
  • AI写诗怎么实现_使用文心一言创作古典诗词步骤

    文心一言通过深度学习海量诗词数据,掌握格律、意象、情感表达模式,能根据具体指令生成古典诗词。其核心是基于统计关联理解“意境”与“情感”,如将“夕阳”“孤舟”与离愁关联,依赖Transformer模型捕捉上下文语义。用户需提供体裁、主题、情感、关键词等明确指令,通过多轮迭代修改,实现人机协同创作。AI…

    2025年12月5日
    000
  • PHP SimpleXML解析多维XML数据:高效访问与最佳实践

    本文旨在指导开发者如何高效地使用PHP的SimpleXML扩展来解析和访问多维XML数据,避免常见的转换误区。我们将深入探讨SimpleXML对象的结构特性,演示如何直接通过对象属性访问XML元素和属性,并提供实用的代码示例和错误处理建议,帮助您更专业、更流畅地处理XML响应。 理解PHP Simp…

    2025年12月5日
    100
  • 如何让你的Laravel网站拥有App般的体验?使用silviolleite/laravelpwa轻松实现PWA!

    可以通过一下地址学习composer:学习地址 告别传统Web的束缚:我的PWA探索之路 作为一名laravel开发者,我一直致力于为用户提供最佳的web体验。然而,随着移动设备普及,用户习惯了app的即时启动、离线可用和添加到主屏幕等便捷功能,传统web网站在这些方面显得力不从心。我的一个电商项目…

    开发工具 2025年12月5日
    000
  • JavaScript数字格式化中意外空格问题的解决方案

    本文旨在解决JavaScript中处理用户输入时,因意外的空白字符导致数字格式化功能出现异常的问题。通过引入String.prototype.trim()方法,我们能够有效地清除输入字符串首尾的空白,确保Intl.NumberFormat等格式化工具能正确处理纯数字内容,从而提升数据处理的准确性和用…

    2025年12月5日
    000
  • TypeNotPresentException与泛型类型擦除的关系是什么?

    typenotpresentexception通常由运行时类型信息缺失引起,与泛型类型擦除间接相关。1. 泛型类型擦除是java在编译时移除泛型参数并替换为限定类型或object的机制,导致list和list在运行时无法区分;2. typenotpresentexception主要发生在依赖缺失、反…

    2025年12月5日 java
    000

发表回复

登录后才能评论
关注微信