开发者

Updating google docs document with google api java client

I have gotten almost a complete API to work, with creating and deleting documents and folders. But I fail at updating documents. It was very easy when using gdata, but since this code has to work on all android devices, I have to use google api java client. Here is a method where I test the updating:

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;
    }
}

What happens is that I开发者_运维知识库 just create a new document (with the given content, creating a new document works perfect). If I do add the "If-Match: *"-header, I get this exception:

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)
...


For updating an existing document you should use PUT command: Updating documents


You first need to query for the file. In the response you want to look for an element among the list of links whose name is "edit-media". You then post to that address.

The code below can be added to Google's sample project docs-v3-atom-oauth-sample from google-client api's website 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();
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜