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/1286646.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月11日 04:07:47
下一篇 2025年12月11日 04:07:56

相关推荐

  • PHP导入CSV数据至MySQL:空值处理策略与实践

    本教程旨在解决PHP从CSV文件导入数据至MySQL数据库时,因CSV中存在空值导致SQL插入失败的问题。我们将详细介绍如何利用PHP的条件判断机制,在数据插入前自动识别并填充空字段,确保不同数据类型(如整数和字符串)的字段都能被正确处理,从而实现数据平滑导入,避免手动修改CSV文件的繁琐。 问题背…

    2025年12月11日
    000
  • 如何在PHPMyAdmin中设置访问日志记录

    phpmyadmin本身没有内置的访问日志功能,但可以通过mysql通用查询日志和web服务器日志实现操作追踪。1. 通过启用mysql的通用查询日志(general query log),可记录所有通过phpmyadmin执行的sql语句,包括用户执行的具体操作;2. web服务器(如apache…

    2025年12月11日 好文分享
    000
  • 合并数组并保留键名的实用技巧

    本文旨在介绍如何高效地合并一个包含多个子数组的数组,并保留每个子数组的键名,最终得到一个包含所有键值对的单一数组。我们将探讨一种简单易懂的实现方法,并解释其背后的逻辑,帮助你更好地理解和应用数组合并技巧。 在PHP中,有时我们需要将一个包含多个子数组的数组合并成一个单一数组,并且要保留每个子数组中的…

    2025年12月11日
    000
  • 解决 Laravel 与 Vue.js 应用中数据未正确显示的问题

    本文旨在帮助开发者解决在使用 Laravel 作为后端 API,Vue.js 作为前端框架构建应用时,数据无法正确显示的问题。通过分析常见的错误原因,并提供详细的代码示例和解决方案,确保数据能从 Laravel 后端成功传递到 Vue.js 前端,并正确渲染。 在使用 laravel 和 vue.j…

    2025年12月11日
    000
  • 解决 Laravel 迁移中外键重复列错误:foreignId 的正确使用

    本文探讨 Laravel 8 迁移中常见的“重复列”外键错误,该错误通常源于同时使用 unsignedBigInteger 和 foreignId 定义同一列。教程将详细解释 foreignId()->constrained() 的正确用法,指出其已包含列创建逻辑,从而避免重复定义,确保数据库…

    2025年12月11日
    000
  • jQuery Ajax提交复杂表单数据:正确处理数组元素

    本教程详细讲解如何利用jQuery Ajax高效提交包含数组结构命名(如name=”item[0][prop]”)的HTML表单数据。通过使用jQuery.serialize()方法,可将此类复杂数据自动转换为标准的URL编码格式,确保服务器端(如PHP的$_POST超全局变…

    2025年12月11日
    000
  • Laravel迁移中外键重复列错误解决方案:正确使用foreignId

    本文旨在解决Laravel 8迁移中添加外键时遇到的“列已存在”错误。核心问题在于同时定义unsignedBigInteger和foreignId导致列重复。教程将详细解释foreignId的正确用法,并提供规范的代码示例,确保外键创建的顺畅与高效,避免常见的迁移冲突,提升数据库结构定义的准确性。 …

    2025年12月11日
    000
  • 解决Laravel迁移中外键重复列错误:正确使用foreignId

    本文旨在解决Laravel数据库迁移中遇到的外键重复列错误。当使用php artisan migrate:fresh时,若同时显式定义列类型(如unsignedBigInteger)又使用foreignId方法创建外键,会导致Duplicate column name错误。核心解决方案是理解fore…

    2025年12月11日
    000
  • JavaScript日期操作:为HTML日期输入框动态设置最大日期

    本文详细介绍了如何使用JavaScript为HTML日期输入框动态设置最大日期。通过利用Date对象的setDate()方法,而非不存在的addDays()方法,可以精确地增加指定天数,并将计算出的日期格式化为YYYY-MM-DD字符串后赋值给元素的max属性,从而实现日期范围的限制,提升用户体验,…

    2025年12月11日
    000
  • 使用jQuery和Ajax提交包含数组命名元素的HTML表单

    本文详细介绍了如何使用jQuery的Ajax功能,正确提交包含数组命名(如name=”array[index][field]”)的HTML表单数据。通过利用jQuery.serialize()方法,可以确保数据以标准URL编码格式发送,从而在服务器端(如PHP的$_POST)…

    2025年12月11日 好文分享
    000
  • JavaScript日期计算与HTML日期输入框的max属性动态设置指南

    本文旨在详细阐述如何在JavaScript中正确地对日期进行加减操作,特别是增加指定天数,并利用计算结果动态设置HTML 元素的max属性。文章将纠正常见的addDays()方法误区,提供基于setDate()的正确实现,并结合实际应用场景,提供完整的代码示例和最佳实践,帮助开发者提升日期处理的准确…

    2025年12月11日
    000
  • JavaScript日期操作:为HTML日期输入框设置动态最大日期

    本教程详细讲解如何使用JavaScript为HTML日期输入框动态设置最大日期。我们将学习如何从用户选择的日期中增加指定天数(例如21天),并利用Date对象的setDate()方法进行精确计算。文章还将指导如何将计算出的新日期格式化为HTML input type=”date&#822…

    2025年12月11日
    000
  • PHP array_walk 回调函数中引用传参的正确姿势

    本文详细探讨了在 PHP array_walk 函数中使用回调函数时,如何正确地传递变量引用。通过分析常见的错误尝试,如在 array_walk 调用时使用引用符号,或在回调函数定义中忽略引用,文章揭示了正确的实现方法:在回调函数的参数定义中明确使用引用符号 &。内容涵盖 array_wal…

    2025年12月11日
    000
  • PHP array_walk 回调函数中引用外部变量的正确姿势

    本文深入探讨了 PHP array_walk 函数在回调中使用引用变量的常见误区与最佳实践。我们将详细解释 array_walk 的参数传递机制,特别是其第三个参数如何传递给回调函数,并提供使用匿名函数(闭包)结合 use 关键字实现外部变量引用的正确方法,以确保代码的正确性和可维护性。 理解 ar…

    2025年12月11日
    000
  • PHP array_walk 回调函数中外部变量引用传递的最佳实践

    在 PHP array_walk 函数的回调中,正确引用并修改外部变量是常见的需求。本文将深入解析 array_walk 对回调参数的传递机制,并详细阐述为何直接传递外部变量会导致错误。核心解决方案是利用匿名函数(闭包)结合 use 关键字实现外部变量的引用传递,从而优雅且高效地解决参数传递问题,确…

    2025年12月11日
    000
  • Nginx环境下为PHP 7.4安装SOAP扩展的完整教程

    本文旨在解决在Nginx服务器上,为PHP 7.4版本安装SOAP扩展时遇到的常见问题。通过详细的步骤和代码示例,帮助开发者正确安装并启用SOAP扩展,从而确保PHP 7.4应用能够正常使用SOAP协议进行数据交换。文章涵盖了扩展安装、配置以及重启服务的关键步骤,并提供了一些常见问题的排查方法。 安…

    2025年12月11日
    000
  • 解决 Apache 权限问题:Permission Denied 错误排查与修复

    本文旨在解决在使用 Apache 服务器时遇到的 “Permission Denied” 权限错误,尤其是在进行文件操作(如创建 ZIP 压缩包)时。通过分析错误原因,提供详细的解决方案,包括权限设置、目录结构以及用户权限等方面,帮助开发者快速定位并解决问题。 当在使用 Ap…

    2025年12月11日
    000
  • 博客系统开发怎么做?PHP+MySQL项目实战

    开发博客系统需先理清需求,选择php+mysql技术栈。一、搭建基础结构:采用mvc模式规划目录,手动实现逻辑更利于理解流程。二、数据库设计:合理建立users、categories、posts、comments表并设置外键与加密字段。三、实现功能模块:按顺序完成注册登录、文章管理、分类管理、评论功…

    2025年12月11日 好文分享
    000
  • 解决PHPMyAdmin操作数据库时的日志文件过大问题

    要解决phpmyadmin操作导致数据库日志文件过大的问题,1.应关闭不必要的通用查询日志;2.配置二进制日志的过期时间和最大大小;3.合理设置慢查询日志的阈值和记录条件;4.定期手动或自动清理日志文件;5.使用logrotate等工具进行日志轮转管理;6.避免在phpmyadmin中执行大规模低效…

    2025年12月11日 好文分享
    000
  • 如何优化PHPMyAdmin操作数据库的并发处理能力

    提高phpmyadmin并发处理能力需从服务器资源优化、php配置调整、phpmyadmin配置优化、数据库查询优化等方面入手。1. 优化服务器资源配置,如升级cpu、内存和磁盘i/o,并使用监控工具分析负载情况;2. 调整php参数,包括memory_limit、max_execution_tim…

    2025年12月11日 好文分享
    000

发表回复

登录后才能评论
关注微信