Pregunta

He conseguido casi una API completa para el trabajo, con la creación y eliminación de documentos y carpetas. Pero no llego a los documentos de actualización. Fue muy fácil cuando se utiliza gdata, pero ya que este código tiene que trabajar en todos los dispositivos Android, tengo que usar google cliente API de Java. Aquí es un método en el que probar la actualización:

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

Lo que pasa es que acabo de crear un nuevo documento (con el contenido dado, la creación de un nuevo documento funciona perfecto). Si hago añadir el "If-Match: *" - encabezado, consigo esta excepción:

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

Solución

Para actualizar un documento existente se debe utilizar comando PUT: Actualización documentos

Otros consejos

Primero tiene que consulta para el archivo. En la respuesta que desea buscar un elemento en la lista de enlaces cuyo nombre es "edit-media". A continuación, publique en esa dirección.

El código siguiente se puede agregar a docs-v3-átomo-oauth-muestreo del proyecto de muestra de Google del sitio web de Google API-cliente 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top