Обновление документа Google Docs с помощью клиента Google API Java
-
26-09-2019 - |
Вопрос
Я получил почти полный API для работы с созданием и удалением документов и папок. Но я терпеть неудачу при обновлении документов. Это было очень легко при использовании gdata, но поскольку этот код должен работать на всех устройствах Android, я должен использовать клиент Google 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;
}
}
Что произойдет, это то, что я просто создаю новый документ (с данным контентом, создавая новый документ работает идеально). Если я добавлю «if-Match: *» - заголовок, я получаю это исключение:
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)
...
Решение
Для обновления существующего документа вы должны использовать команду PUT: Обновление документов
Другие советы
Вам сначала нужно запросить файл. В ответ вы хотите искать элемент среди списка ссылок, имя которого является «редактирование-носитель». Затем вы публикуете на этот адрес.
Подведенный ниже код можно добавить в образец Google Project Project Docs-V3-Atom-Oauth-образца из веб-сайта Google-Client API http://code.google.com/p/google-ap-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();
}
}