Google My Business API:PHP客戶端正確使用readMask獲取地點列表

Google My Business API:PHP客戶端正確使用readMask獲取地點列表

本教程旨在解決使用Google My Business Business Information API php客戶端獲取地點列表時,因readMask參數(shù)格式不正確導(dǎo)致的INVALID_ARGUMENT錯誤。文章將詳細解釋readMask字段的正確用法,指出其應(yīng)指定地點資源的有效屬性,而非用戶或照片相關(guān)字段。通過具體代碼示例,幫助開發(fā)者順利獲取所需的地點信息,避免常見的api調(diào)用陷阱。

Google My Business Business Information API 概述

google my business business information api 是 google 提供的用于管理 google 商家資料的最新接口。它允許開發(fā)者以編程方式訪問和更新商家信息,包括地點詳情、營業(yè)時間、照片、評論等。相較于舊版的 google my business api (v4),新版 api 提供了更細粒度的控制和更清晰的資源結(jié)構(gòu)。

在使用 PHP 客戶端庫與此 API 交互時,通常會涉及以下幾個核心步驟:

  1. 初始化 Google 客戶端并進行認證。
  2. 獲取賬戶管理服務(wù)實例 (Google_Service_MyBusinessAccountManagement) 以列出和選擇商家賬戶。
  3. 獲取商家信息服務(wù)實例 (Google_Service_MyBusinessBusinessInformation) 以操作地點(location)資源。
  4. 調(diào)用相應(yīng)的方法,例如 accounts_locations->listAccountsLocations() 來獲取賬戶下的地點列表。

readMask 參數(shù)解析與常見錯誤

在調(diào)用 API 獲取資源列表或詳情時,readMask 是一個非常重要的參數(shù)。它允許您指定 API 響應(yīng)中應(yīng)包含的資源字段,從而實現(xiàn)“部分響應(yīng)”(Partial Response)。這是一種優(yōu)化策略,可以顯著減少傳輸?shù)臄?shù)據(jù)量,提高 API 調(diào)用的效率。

然而,readMask 的使用不當是導(dǎo)致 INVALID_ARGUMENT 錯誤的一個常見原因。當您嘗試使用 Google_Service_MyBusinessBusinessInformation 服務(wù)的 accounts_locations->listAccountsLocations() 方法獲取地點列表時,如果 readMask 參數(shù)中包含了不屬于 Location 資源本身的字段,API 將返回 http 400 Bad Request 錯誤,并附帶 INVALID_ARGUMENT 狀態(tài)碼及 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"           }         ]       }     ]   } }

這個錯誤發(fā)生的原因是 user.display_name 和 photo 并非 Location 資源直接擁有的屬性。readMask 必須指向 Location 資源(或其嵌套子資源)中定義的有效字段。例如,地點名稱 (name)、標題 (title)、網(wǎng)站 URI (websiteUri)、地址 (address)、經(jīng)緯度 (latlng) 等才是 Location 資源的合法屬性。

立即學(xué)習PHP免費學(xué)習筆記(深入)”;

readMask 的正確用法

要正確使用 readMask,您必須查閱 Google My Business Business Information API 的官方文檔,特別是關(guān)于 Location 資源的定義。該文檔會列出所有可用的字段及其類型。

正確的 readMask 應(yīng)包含以下類型的字段:

  • 頂級字段: 如 name (地點資源名稱), title (商家標題), websiteUri (網(wǎng)站URI), languageCode 等。
  • 嵌套字段: 如果某個字段本身是一個對象,您可以指定其子字段,例如 address.regionCode, address.locality, latlng.latitude, latlng.longitude。

示例: 如果您想獲取地點的名稱、標題、網(wǎng)站 URI 和地址信息,您的 readMask 可以是: name,title,websiteUri,address.regionCode,address.locality,address.postalCode,address.addressLines

PHP 客戶端示例:正確獲取地點列表

以下是一個使用 PHP 客戶端庫正確獲取 Google My Business 地點列表的示例代碼,其中包含了 readMask 的正確用法和基本的錯誤處理:

<?php  require_once 'vendor/autoload.php'; // 確保你已通過composer安裝Google API Client庫  /**  * 這是一個示例函數(shù),用于初始化 Google 客戶端。  * 在實際應(yīng)用中,你需要根據(jù)你的認證方式(如服務(wù)賬戶、OAuth 2.0)來配置 $client。  *  * @return GoogleClient 已認證的 Google 客戶端實例  */ function getGoogleClient() {     $client = new GoogleClient();     $client->setApplicationName('My Business API Locations Example');      // 假設(shè)你使用服務(wù)賬戶認證     // 請?zhí)鎿Q為你的服務(wù)賬戶憑據(jù)文件路徑     $client->setAuthConfig('path/to/your/service_account_credentials.json');       // 或者使用 OAuth 2.0 認證流程     // $client->setRedirectUri('YOUR_REDIRECT_URI');     // $client->setAccessToken('YOUR_ACCESS_TOKEN'); // 或使用刷新令牌獲取新令牌      // 設(shè)置必要的 API 作用域     $client->setScopes([         'https://www.googleapis.com/auth/business.manage' // 管理商家資料的權(quán)限     ]);      return $client; }  try {     $client = getGoogleClient();      // 1. 獲取賬戶管理服務(wù)實例     $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服務(wù)實例     $mybusinessService = new Google_Service_MyBusinessBusinessInformation($client);      // 4. 準備查詢參數(shù)     $queryParams = [         "pageSize" => 10, // 每頁獲取10個地點         // 關(guān)鍵點: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 服務(wù)下的 Locations 集合     $locationsList = $mybusinessService->accounts_locations->listAccountsLocations($account->name, $queryParams);      // 6. 處理返回的地點數(shù)據(jù)     $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 "  網(wǎng)站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 "  經(jīng)緯度: " . $latlng->getLatitude() . ", " . $latlng->getLongitude() . "n";             }             if ($location->getPrimaryCategory()) {                 echo "  主類別: " . $location->getPrimaryCategory()->getDisplayName() . "n";             }             // 訪問其他通過 readMask 請求的字段         }         echo "--------------------n";          // 如果有下一頁,可以繼續(xù)獲取         if ($locationsList->getNextPageToken()) {             echo "存在更多地點,下一頁令牌: " . $locationsList->getNextPageToken() . "n";             // 您可以在此處添加邏輯以獲取下一頁數(shù)據(jù)         }      } else {         echo "該賬戶下未找到任何地點。n";     }  } catch (GoogleServiceException $e) {     // 捕獲 Google API 服務(wù)的特定異常     echo "API調(diào)用失敗: " . $e->getMessage() . "n";     $errors = $e->getErrors();     if (!empty($errors)) {         foreach ($errors as $error) {             echo "錯誤詳情: " . ($error['message'] ?? 'N/A') . "n";             echo "錯誤狀態(tài): " . ($error['status'] ?? 'N/A') . "n";             if (isset($error['details'][0]['fieldViolations'])) {                 foreach ($error['details'][0]['fieldViolations'] as $violation) {                     echo "字段違規(guī): " . ($violation['field'] ?? 'N/A') . " - " . ($violation['description'] ?? 'N/A') . "n";                 }             }         }     } } catch (Exception $e) {     // 捕獲其他通用異常     echo "發(fā)生未知錯誤: " . $e->getMessage() . "n"; }  ?>

注意事項與最佳實踐

  1. 查閱官方文檔: 始終以 Google My Business Business Information API 的官方文檔作為 readMask 字段的最終參考。Location 資源的詳細定義將明確指出所有可用的字段。
  2. 精確指定字段: 只請求您實際需要的字段。這不僅可以避免 INVALID_ARGUMENT 錯誤,還能減少網(wǎng)絡(luò)傳輸量和 API 響應(yīng)處理時間,提高應(yīng)用程序性能。
  3. 錯誤處理: 實現(xiàn)健壯的錯誤處理機制。捕獲 GoogleServiceException 可以幫助您識別 API 返回的特定錯誤(如 400 Bad Request),并根據(jù)錯誤詳情進行調(diào)試。
  4. 認證與授權(quán): 確保您的 Google 客戶端已正確配置了認證憑據(jù)(如 OAuth 2.0 憑據(jù)或服務(wù)賬戶)和必要的 API 作用域(例如 https://www.googleapis.com/auth/business.manage)。權(quán)限不足也會導(dǎo)致 API 調(diào)用失敗。
  5. 分頁處理: 當?shù)攸c數(shù)量較多時,API 響應(yīng)會進行分頁。利用 pageSize 和 nextPageToken 參數(shù)來循環(huán)獲取所有地點數(shù)據(jù)。

總結(jié)

正確理解和使用 readMask 參數(shù)是有效利用 Google My Business Business Information API 的關(guān)鍵。通過確保 readMask 中指定的字段與目標資源(如 Location)的實際屬性相符,可以避免常見的 INVALID_ARGUMENT 錯誤,并實現(xiàn)高效、精準的數(shù)據(jù)獲取。開發(fā)者在集成 API 時,務(wù)必仔細查閱官方文檔,以確保參數(shù)的正確性。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊11 分享