Подтвердить что ты не робот

Обновление/удаление записи в приложениях Google - не найдено ETag

При попытке обновить запись в 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/[email protected]/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="[email protected]" 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>
4b9b3361

Ответ 1

На первый взгляд все кажется ОК, но, глядя на документы google (каламбур), кажется, что google сразу же ставит этиг как атрибут непосредственно в теге записи:

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

Изменить: документы, конечно, могут быть найдены Googlin ', но, возможно, прямая ссылка проще.

Ответ 2

Вам нужно добавить заголовок с тегом E, если вы не хотите заботиться об этом, вы можете использовать:

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