Pergunta

Eu consegui uma API quase completa para trabalhar, criando e excluindo documentos e pastas. Mas eu falhei na atualização de documentos. Foi muito fácil ao usar o GDATA, mas como esse código precisa funcionar em todos os dispositivos Android, tenho que usar o Google API Java Client. Aqui está um método em que eu testo a atualização:

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

O que acontece é que eu apenas crio um novo documento (com o conteúdo fornecido, a criação de um novo documento funciona perfeitamente). Se eu adicionar o cabeçalho "if-match: *"-, recebo esta exceção:

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)
...
Foi útil?

Solução

Para atualizar um documento existente, você deve usar o comando put: Atualizando documentos

Outras dicas

Você primeiro precisa consultar o arquivo. Na resposta, você deseja procurar um elemento entre a lista de links cujo nome é "Edit-Media". Você então posta para esse endereço.

O código abaixo pode ser adicionado ao projeto de amostra do Google DOCS-V3-ATOM-OAuth-Sple do site da API do Google-Client 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();
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top