You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,实际上是因为参数格式传递错误,或是客户端库版本问题导致的参数解析失败。

具体修正步骤

  1. 使用正确的参数格式:personFields必须是字符串格式的字段列表,不能传数组,数组形式会被客户端库错误解析,导致API识别不到参数,进而返回误导性的readMask错误。
  2. 字段无需前缀:personFields中的字段不需要加person.前缀,直接使用names,phoneNumbers,emailAddresses,biographies即可。
  3. 补充Biography字段的类型设置:默认情况下,个人简介字段需要指定内容类型,否则可能导致创建失败,需添加setContentType('TEXT')。
  4. 更新客户端库:确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:12:01