API Списка документов Google - Как опубликовать документ - PullRequest
2 голосов
/ 19 апреля 2011

Я совершенно не понимаю, как можно программным способом опубликовать Документ Google (в частности, электронную таблицу).

Я прочитал Руководство по протоколу API Списка документов Google и обнаружил следующее:

http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#GettingRevisions

Следующий раздел статьи начинается с «Публикация документов путем публикации одной ревизии», и вот где я нашел этот пример:

PUT /feeds/default/private/full/resource_id/revisions/revision_number
GData-Version: 3.0
Authorization: <your authorization header here>
Content-Length: 722
Content-Type: application/atom+xml

<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gd='http://schemas.google.com/g/2005'
       xmlns:docs="http://schemas.google.com/docs/2007" gd:etag="W/"DkIBR3st7ImA9WxNbF0o."">
  <id>https://docs.google.com/feeds/id/resource_id/revisions/1</id>
  <updated>2009-08-17T04:22:10.440Z</updated>
  <app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-06T03:25:07.799Z</app:edited>
  <title>Revision 1</title>
  <content type="text/html" src="https://docs.google.com/feeds/download/documents/Export?docId=doc_id&amp;revision=1"/>
  <link rel="alternate" type="text/html"
      href="https://docs.google.com/Doc?id=doc_id&amp;revision=1"/>
  <link rel="self" type="application/atom+xml"
      href="https://docs.google.com/feeds/default/private/full/resource_id/revisions/1"/>
  <author>
    <name>user</name>
    <email>user@gmail.com</email>
  </author>
  <docs:publish value="true"/>
  <docs:publishAuto value="false"/>
</entry>

Я искалканалы списка документов и листы CRUDing, но я не могу заставить публикацию работать, и я не понимаю, как она должна работать.Моя основная установка для установления соединения с моим фидом и подготовки данных к PUT выглядит следующим образом:

<?php
set_include_path($_SERVER['DOCUMENT_ROOT'].'/library/');

require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);


$theId = 'my-worksheet-id';

$user = "my-gmail-account-name";
$pass = "my-gmail-account-password";
$service = Zend_Gdata_Docs::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);

$service = new Zend_Gdata($client);


$xml = "<entry  xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'
        xmlns:docs='http://schemas.google.com/docs/2007' gd:etag='W/\"DkIBR3st7ImA9WxNbF0o.\"'>

        <id>https://docs.google.com/feeds/id/spreadsheet:$theId/revisions/1</id>
        <updated>2009-08-17T04:22:10.440Z</updated>
        <app:edited xmlns:app='http://www.w3.org/2007/app'>2009-08-06T03:25:07.799Z</app:edited>
        <title>Revision 1</title>
        <content type='text/html' src='https://docs.google.com/feeds/download/documents/Export?docId=$theId&amp;revision=1'/>
        <link rel='alternate' type='text/html'
            href='https://docs.google.com/Doc?id=$theId&amp;revision=1'/>
        <link rel='self' type='application/atom+xml'
            href='https://docs.google.com/feeds/default/private/full/spreadsheet:$theId/revisions/1'/>
        <author>
            <name>$user</name>
            <email>$user</email>
        </author>
        <docs:publish value='true'/>
        <docs:publishAuto value='false'/>
      </entry>";

$putURL = "http://docs.google.com/feeds/default/private/full/spreadsheet:".$theId."/revisions/0";
$data = $service->put($xml, $putURL);
?>

Что приводит к

Fatal error: Uncaught exception 'Zend_Gdata_App_HttpException' with message 'Expected response code 200, got 400 Invalid request URI

Может ли кто-нибудь мне помочь?Кто-нибудь успешно опубликовал Документ Google программно?

Ответы [ 4 ]

2 голосов
/ 22 июля 2011

Предполагая, что документ уже создан и имеет идентификатор документа XXXX

Вам нужно отправить запрос «PUT» с определенными заголовками и XML (запись, описывающую ваш документ) в качествеbody, на определенный URL.

Поскольку вы не изменяете содержимое документа (только метаданные), целевой URL будет выглядеть следующим образом ...

https://docs.google.com/feeds/default/private/full/XXXX/revisions/0

Первое, что вам нужно сделать, это пройти аутентификацию с помощью соответствующего сервиса Google.

$client = Zend_Gdata_ClientLogin::getHttpClient(GDOC_LOGIN, GDOC_PASS,'writely');

Используйте возвращенный объект, чтобы получить свой токен авторизации.

$auth_token = $client->getClientLoginToken();

ВZend / Gdata / App.php является вспомогательной функцией для выполнения запроса PUT.Подготовьте параметры для этого метода следующим образом ...

$method = "PUT";
$url ="https://docs.google.com/feeds/default/private/full/XXXX/revisions/0";
$headers['GData-Version'] = '3.0';
$headers['If-Match'] = '*';
$headers['Authorization'] = "GoogleLogin auth = $auth_token";
$headers['Content-Length'] = '380';
$headers['Content-Type'] = 'application/atom+xml';
$body = <<<XML
<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:docs="http://schemas.google.com/docs/2007"
    xmlns:gd="http://schemas.google.com/g/2005">
  <category scheme="http://schemas.google.com/g/2005#kind"
      term="http://schemas.google.com/docs/2007#spreadsheet"/>
    <docs:publish value="true"/>
    <docs:publishAuto value="true"/>
</entry>
XML;
$contentType = "application/atom+xml";
$remainingRedirects = 99;

Затем вызовите вспомогательную функцию ...

$app = new Zend_Gdata_App();
$app->performHttpRequest($method, $url, $headers, $body, $contentType, $remainingRedirects);

Удачи!Дайте мне знать, если это поможет!

1 голос
/ 21 июня 2011

Хорошо ... с чего начать?

Прежде всего, ваш URL неверен. (идентификатор ресурса, который вы используете для JSON / XML, а не URL)

у вас есть

$putURL = "http://docs.google.com/feeds/default/private/full/spreadsheet:".$theId."/revisions/0";

и у вас должно быть

$putURL = "http://docs.google.com/feeds/default/private/full/$theId/revisions/0";

(вы можете не указывать конкатенацию, если используете "в качестве разделителей")

теперь есть другие проблемы, так как вы вручную создаете запись XML.

  1. Ваш заголовок авторизацииотсутствует.
  2. В вашем XML вы используете ревизию 1, но в вашем URL у вас есть значение revision / 0
  3. , написанное вручную, и я уверен, что вы не пытаетесь опубликовать 2лет. То же самое для и
  4. ДОЛЖНЫ СРАВНИТЬ найденный etag, иначе вы не сможете выполнить любой запрос PUT.

Теперь вы можете изменять эти значения, назначая переменные вручную, ноЯ думаю, что лучше использовать структурированный возвращаемый объект Zend GData.

В любом случае:

  1. Получить из Google документ, который вы хотите опубликовать.
  2. Найдите правильныйзапись (в этом случае запись с идентификатором https://docs.google.com/feeds/id/spreadsheet:$theId/revisions/1)
  3. изменить документs: опубликовать значение свойства в "true"
  4. отправить запрос на размещение с измененной записью

, которая должна работать

0 голосов
/ 06 мая 2011

Google сообщает, что введенные данные неверны, и отвечает вам кодом 400.

попробуйте разместить этот код

<?xml version='1.0' encoding='UTF-8'?>

перед

<entry  xmlns='http://www.w3.org/2005/Atom'...
0 голосов
/ 20 апреля 2011

Я новичок в Zend_Gdata, но успешно загрузил в Документы Google.

Я не знаю, зачем это, но вот мой код:

$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
);

Надеюсь, это поможет,

Garry

...