更新/删除谷歌应用条目 - 未找到 ETag


Update/delete Google apps entry - No ETag found

尝试更新Google Apps上的条目时,返回No ETag found。添加条目工作正常,但不能更新或删除条目!?

ETag 将添加到代码中最后一行之一的标头中:

$this->gdata->updateEntry($doc->saveXML(), $update_entry->getEditLink()->href, null, array('If-Match' => '*'));

例外

Expected response code 200, got 409

法典

private function update_entry($data, $update_entry=null){
        $doc = new DOMDocument();
        $doc->formatOutput = true;
        $entry = $doc->createElement('atom:entry');
        $entry->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:atom', 'http://www.w3.org/2005/Atom');
        $entry->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:gd', 'http://schemas.google.com/g/2005');
        $doc->appendChild($entry);
        if($update_entry){
            preg_match('/^"?([^"]*)"?$/i', $update_entry->getEtag(), $matches);
            $etag_value = $matches[1];
            $entry->setAttribute('gd:etag', $etag_value);
            $id = $doc->createElement('id', 'http://www.google.com/m8/feeds/contacts/'.$this->admin_user.'/base/'.$data['alias']);
        $entry->appendChild($id);
        }
        $name = $doc->createElement('gd:name');
        $entry->appendChild($name);
        $fullName = $doc->createElement('gd:fullName', $data['name']);
        $name->appendChild($fullName);
        if($data['title']){
            $org = $doc->createElement('gd:organization');
            $org->setAttribute('rel' ,'http://schemas.google.com/g/2005#work');
            $entry->appendChild($org);
            $orgName = $doc->createElement('gd:orgTitle', $data['title']);
            $org->appendChild($orgName);
        }
        if($data['email']){
            $email = $doc->createElement('gd:email');
            $email->setAttribute('address', $data['email']);
            $email->setAttribute('rel', 'http://schemas.google.com/g/2005#work');
            $entry->appendChild($email);
        }
        if($data['phone_work']){
            $phone_work = $doc->createElement('gd:phoneNumber', $data['phone_work']);
            $phone_work->setAttribute('rel', 'http://schemas.google.com/g/2005#work');
            $entry->appendChild($phone_work);
        }
        if($data['phone_work_mobile']){
            $phone_work_mobile = $doc->createElement('gd:phoneNumber', $data['phone_work_mobile']);
            $phone_work_mobile->setAttribute('rel', 'http://schemas.google.com/g/2005#work_mobile');
            $entry->appendChild($phone_work_mobile);
        }
        if($update_entry){
            echo $doc->saveXML();
            $this->gdata->updateEntry($doc->saveXML(), $update_entry->getEditLink()->href, null, array('If-Match' => $etag_value));
        }
        else{
            $this->gdata->insertEntry($doc->saveXML(), 'http://www.google.com/m8/feeds/contacts/'.self::DOMAIN.'/full');
        }
    }

.XML

<?xml version="1.0"?>
<atom:entry xmlns:atom="http://www.w3.org/2005/Atom" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="CxFbERtcFit7I2Bu">
  <id>http://www.google.com/m8/feeds/contacts/admin_user@domain.com/base/alias</id>
  <gd:name>
    <gd:fullName>name</gd:fullName>
  </gd:name>
  <gd:organization rel="http://schemas.google.com/g/2005#work">
    <gd:orgTitle>title</gd:orgTitle>
  </gd:organization>
  <gd:email address="mail@domain.com" rel="http://schemas.google.com/g/2005#work"/>
  <gd:phoneNumber rel="http://schemas.google.com/g/2005#work">22260435</gd:phoneNumber>
  <gd:phoneNumber rel="http://schemas.google.com/g/2005#work_mobile">1112223</gd:phoneNumber>
</atom:entry>

乍一看,一切似乎都很好,但查看谷歌文档(双关语),谷歌似乎直接将 etag 作为条目标签上的属性:

<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="BxAaTxRZAyp7ImBq">

编辑:文档当然可以通过Googlin找到,但也许直接链接更容易。

您需要添加一个带有 E 标签的标头,如果您不想关心它,您可以使用:

$this->gdata->setHeaders('If-Match: *');