代码之家  ›  专栏  ›  技术社区  ›  pgsandstrom

用谷歌API Java客户端更新谷歌文档文档

  •  1
  • pgsandstrom  · 技术社区  · 15 年前

    我已经得到了一个几乎完整的API,可以创建和删除文档和文件夹。但我更新文件时失败了。使用GDATA非常容易,但是因为这个代码必须在所有Android设备上工作,所以我必须使用谷歌API Java客户端。以下是我测试更新的方法:

    public void updateTest() throws IOException {
        InputStreamContent isContent = new InputStreamContent();
        isContent.inputStream = new ByteArrayInputStream("NEW CONTENT".getBytes("UTF-8"));
        isContent.type = "text/plain";
    
        HttpRequest request = transport.buildPostRequest();
        request.setUrl("https://docs.google.com/feeds/default/media/document:0A[snip]3Y");
    
        request.content = isContent;
    
        // request.headers.set("If-Match", "*");
    
        try {
            request.execute().parseAs(DocumentListEntry.class);
        } catch (HttpResponseException e) {
            if (Constant.DEBUG) Log.d(TAG, "error: " + e.response.parseAsString());
            throw e;
        } catch (ClientProtocolException e) {
            if (Constant.DEBUG) Log.d(TAG, "error: " + e.getMessage());
            throw e;
        }
    }
    

    我只是创建了一个新文档(对于给定的内容,创建一个新文档是完美的)。如果我添加了“如果匹配:*”-页眉,我会得到这个异常:

    11-19 11:17:16.536: DEBUG/DocsAPI(32195): error: <errors xmlns='http://schemas.google.com/g/2005'>
    11-19 11:17:16.536: DEBUG/DocsAPI(32195): <error>
    11-19 11:17:16.536: DEBUG/DocsAPI(32195): <domain>GData</domain>
    11-19 11:17:16.536: DEBUG/DocsAPI(32195): <code>noPostConcurrency</code>
    11-19 11:17:16.536: DEBUG/DocsAPI(32195): <internalReason>POST method does not support concurrency</internalReason>
    11-19 11:17:16.536: DEBUG/DocsAPI(32195): </error>
    11-19 11:17:16.536: DEBUG/DocsAPI(32195): </errors>
    11-19 11:17:16.536: WARN/System.err(32195): com.google.api.client.http.HttpResponseException: 501 Not Implemented
    11-19 11:17:16.540: WARN/System.err(32195):     at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:209)
    ...
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Peter Knego    15 年前

    要更新现有文档,应使用PUT命令: Updating documents

        2
  •  1
  •   LPL user462990    14 年前

    首先需要查询文件。在响应中,您希望在名为“edit media”的链接列表中查找元素。然后你把邮件寄到那个地址。

    下面的代码可以从谷歌客户端API的网站添加到谷歌的示例项目docs-v3-atom-oauth-sample中。 http://code.google.com/p/google-api-java-client/wiki/GoogleAPIs

    private String queryRegistryforEditId() {
        String str ="https://docs.google.com/feeds/default/private/full?title=" + URL_FRIENDLY_QUERY_PHRASE;
        DocsUrl url = new DocsUrl(str);
    
        DocumentListFeed feed;
        try {
            feed = DocumentListFeed.executeGet(transport, url);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    
        //display(feed);
        String ans = null;
        //LIST OF FILES MATCHING QUERY
        for (DocumentListEntry doc : feed.docs) {
            //doc.content.src has url to download file
            //I added src to content class that comes from the sameple code
            Map<String, String> data = retriveDocUsingId(doc.content.src);
    
            List<Link> lik = doc.links;
            for (Link i : lik) {
                //look for "edit-media" to get url to post edits to file
                if (i.rel.equals("edit-media")) {
                    ans = i.href;
                    System.out.println(i.href);
                }
            }
            //System.out.println(" doc.title: " + doc.title + " doc.id " + doc.id);
        }
        return ans;
    }  
    
    private void updateDocumentText(String edit) {
        HttpRequest request = transport.buildPutRequest();
        request.url = new GoogleUrl(edit);
    
        GoogleHeaders headers = (GoogleHeaders)transport.defaultHeaders;
        headers.contentType = "text/plain";
        headers.gdataVersion = "3";
        headers.slug = "examplefile";
        headers.ifMatch = "*";      
        request.headers = headers;
    
        AtomParser parser = new AtomParser();
        parser.namespaceDictionary = Namespace.DICTIONARY;
        transport.addParser(parser);
        File file = new File ("/newfilepath/test233.txt");
    
        InputStreamContent bContent = new InputStreamContent();
        bContent.type = "text/plain";
        request.content = bContent;
    
        try {
            bContent.setFileInput(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    
        com.google.api.client.http.HttpResponse res2;
        try {
            res2 = request.execute();
            System.out.println(res2.parseAsString());
        } catch (HttpResponseException e) {
            try {
                System.out.println(e.response.parseAsString());
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }   
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    推荐文章