Удалить документ из Документов Google, используя Zend Gdata - PullRequest
1 голос
/ 20 апреля 2011

У меня проблемы с работой с Документами Google и Zend Framework 1.11.4.

Я пытаюсь загрузить документ в Документы Google, получить содержимое HTML и удалить документ. Я работаю с файлами .doc, .pdf и .rtf.

Пока мой код:

$client = Zend_Gdata_ClientLogin::getHttpClient(
    'my@googleDocsEmail.address', 
    'MyPassword', 
    Zend_Gdata_Docs::AUTH_SERVICE_NAME
);
$gdClient = new Zend_Gdata_Docs($client);

$newDocumentEntry = $gdClient->uploadFile(
    $file, 
    null, 
    null, 
    Zend_Gdata_Docs::DOCUMENTS_LIST_FEED_URI
);

$cv = file_get_contents($newDocumentEntry->getContent()->getSrc());

$newDocumentEntry->delete();

Все работает нормально, пока не вызывается метод -> delete (), возвращается исключение Ожидаемый код ответа 200, получено 409

Я уже несколько дней гуглю это, но не могу найти ответа, согласно документации Googles, это правильный способ удаления документа.

Если у кого-то есть представление о том, что я делаю неправильно, любая помощь будет очень кстати.

Большое спасибо заранее, Garry

1 Ответ

0 голосов
/ 15 ноября 2011

У меня возникла та же проблема с 409 ответами при использовании библиотеки Zend_Gdata_Calendar. Существует открытая ошибка в багтрекере Zend Framework. Смотри http://zendframework.com/issues/browse/ZF-10194

Кажется, все сводится к отсутствию заголовка «If-Match», устанавливаемого классом Gdata_App или одним из дочерних классов в цепочке.

Чтобы исправить это для Calendar API, я переопределил класс Zend_Gdata_Calendar и создал вместо него мой класс:

class Zend_Gdata_Calendar_Fixed extends \Zend_Gdata_Calendar {
    /**
     * Overridden to fix an issue with the HTTP request/response for deleting.
     * @link http://zendframework.com/issues/browse/ZF-10194
     */
    public function prepareRequest($method,
                                   $url = null,
                                   $headers = array(),
                                   $data = null,
                                   $contentTypeOverride = null) {
        $request = parent::prepareRequest($method, $url, $headers, $data, $contentTypeOverride);

        if($request['method'] == 'DELETE') {
            // Default to any
            $request['headers']['If-Match'] = '*';

            if($data instanceof \Zend_Gdata_App_MediaSource) {
                $rawData = $data->encode();
                if(isset($rawData->etag) && $rawData->etag != '') {
                    // Set specific match
                    $request['headers']['If-Match'] = $rawData->etag;
                }
            }
        }
        return $request;
    }
}

Тогда используйте это:

...
$gdata = new Zend_Gdata_Calendar_Fixed($httpClient);
...

Я думаю, вы могли бы сделать то же самое, но вместо этого переопределить класс Zend_Gdata_Docs.

...