2

我完全不知道如何以编程方式发布 Google 文档(特别是电子表格)。

我已经阅读了 Google Documents List API 协议指南并发现了这一点:

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

4 回答 4

2

假设文档已经创建并且文档 ID 为 XXXX

您需要做的是向特定 URL 发送带有特定标头和 XML(描述您的文档的条目)作为正文的“PUT”请求。

由于您没有更改文档的任何内容(仅元数据),因此您的目标 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);

祝你好运!让我知道这是否有帮助!

于 2011-07-21T21:18:03.640 回答
1

好的...我从哪里开始?

首先,您的网址不正确。(您使用的资源 ID 用于 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 中,您使用的是版本/0
  3. value 是手动编写的,我很确定您不会尝试发布 2 年前的文件。和
  4. 必须匹配检索到的 etag,否则您将无法执行任何 PUT 请求。

现在您可以通过手动分配变量来更改这些值,但我认为最好使用 Zend GData 结构化返回对象。

任何状况之下:

  1. 从谷歌检索您要发布的文档。
  2. 找到正确的条目(在本例中为 ID为https://docs.google.com/feeds/id/spreadsheet :$theId/revisions/1 的条目)
  3. 将 docs:publish 值属性更改为“true”
  4. 使用修改后的条目发送 put 请求

那应该工作

于 2011-06-21T02:10:49.217 回答
0

我自己是 Zend_Gdata 的新手,但已成功上传到 Google Docs。

我不知道这是否是您所追求的,但这是我的代码:

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

我希望这有帮助,

加里

于 2011-04-20T16:37:32.247 回答
0

谷歌说输入的数据是错误的,并用代码 400 回复你。

尝试放置此代码

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

<entry  xmlns='http://www.w3.org/2005/Atom'...
于 2011-05-06T12:49:45.727 回答