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();
}
}
精彩评论