使用GoogleAPIClient创建谷歌联系人遇Error 400: readMask必填错误
使用Google APIClient创建联系人时遇到readMask必填错误的解决方法
问题背景
我正在尝试使用GoogleAPIClient库在谷歌账户中创建新联系人,以下是我的函数代码:
public function createContact(Google_Client $client, $nombre, $telefonos, $correo, $biografia) { $service = new Google_Service_PeopleService($client); // 创建新联系人并设置姓名、电话号码和简介 $person = new Google_Service_PeopleService_Person(); $name = new Google_Service_PeopleService_Name(); $name->setGivenName($nombre); $person->setNames([$name]); // 创建存储电话号码的列表 $phoneNumbersList = []; foreach ($telefonos as $telefono){ $phoneNumber = new Google_Service_PeopleService_PhoneNumber(); $phoneNumber->setValue($telefono); // 将电话号码添加到列表中 $phoneNumbersList[] = $phoneNumber; } // 将联系人的电话号码设置为刚创建的列表 $person->setPhoneNumbers($phoneNumbersList); $emailAddress = new Google_Service_PeopleService_EmailAddress(); $emailAddress->setValue($correo); $person->setEmailAddresses([$emailAddress]); $biography = new Google_Service_PeopleService_Biography(); $biography->setValue($biografia); $person->setBiographies([$biography]); // 创建联系人 $createdContact = $service->people->createContact($person, [ 'personFields' => 'names,phoneNumbers,emailAddresses,biographies' ]); // 获取创建的联系人ID $contactId = $createdContact->getResourceName(); return $contactId; }
执行该函数时收到如下400错误响应:
{ "error": { "code": 400, "message": "readMask is required. Please specify one or more valid paths. Valid paths are documented at https://developers.google.com/people/api/rest/v1/people/get.", "errors": [ { "message": "readMask is required. Please specify one or more valid paths. Valid paths are documented at https://developers.google.com/people/api/rest/v1/people/get.", "domain": "global", "reason": "badRequest" } ], "status": "INVALID_ARGUMENT" } }
我尝试过设置不同参数(如personFields、readMask、requestMask.includeField),具体调用方式如下:
$createdContact = $service->people->createContact($person, [ 'requestMask.includeField' => 'person.metadata,person.names,person.phoneNumbers,person.emailAddresses,person.biographies' ]); $service->people->createContact($person, ['readMask' => 'names,emailAddresses,phoneNumbers,biographies']); $service->people->createContact($person, ['personFields' => ['names', 'emailAddresses', 'phoneNumbers', 'biographies']]);
但得到的响应始终相同,请问我还需配置什么?函数是否存在错误?
解决方法
问题根源
你混淆了People API不同方法的参数要求:createContact方法需要的是**personFields参数**,但错误提示看似指向readMask,实际上是因为参数格式传递错误,或是客户端库版本问题导致的参数解析失败。
具体修正步骤
- 使用正确的参数格式:
personFields必须是字符串格式的字段列表,不能传数组,数组形式会被客户端库错误解析,导致API识别不到参数,进而返回误导性的readMask错误。 - 字段无需前缀:
personFields中的字段不需要加person.前缀,直接使用names,phoneNumbers,emailAddresses,biographies即可。 - 补充Biography字段的类型设置:默认情况下,个人简介字段需要指定内容类型,否则可能导致创建失败,需添加
setContentType('TEXT')。 - 更新客户端库:确保
google/apiclient和google/apiclient-services为最新版本,旧版本可能存在参数处理bug。
修改后的核心代码
// 修正Biography字段设置 $biography = new Google_Service_PeopleService_Biography(); $biography->setValue($biografia); $biography->setContentType('TEXT'); // 添加这一行 $person->setBiographies([$biography]); // 修正createContact的参数调用 $createdContact = $service->people->createContact($person, [ 'personFields' => 'names,phoneNumbers,emailAddresses,biographies' ]);
为什么之前的尝试失败
readMask是get/list类方法的参数,不属于createContact,用错了场景。requestMask.includeField是旧版API的参数,当前People API v1已不再使用。- 传递数组形式的
personFields会被客户端库错误解析,导致API认为缺少必要参数,返回了不符合当前场景的readMask错误提示。
内容的提问来源于stack exchange,提问作者John Hernández
相关产品推荐
相关产品推荐

