2

J'essaie d'implémenter certaines fonctionnalités de base pour Google Spreadsheets, en utilisant la spécification de protocole avec les demandes.Mise à jour de l'API Spreadsheet Google edit avec le protocole

La raison pour laquelle je fais cela parce que c'est pour Android, et la bibliothèque gdata-java ne fonctionne pas vraiment et l'alpha android ne le coupe pas vraiment. J'ai réussi à implémenter l'authentification, à obtenir des listes, et à les supprimer, mais pour éditer \ mettre à jour une ligne, je ne peux pas vraiment m'en occuper.

Par exemple, je veux changer le contenu d'une cellule here est la spécification du protocole

De ma compréhension, je dois envoyer une sorte de demande au format atome ou XML à l'URL d'édition. Je n'ai jamais envoyé un tel type de demandes.

J'ai également trouvé this, ce qui donne une idée sur la façon dont cela devrait être fait (également une question sans réponse sur un forum), mais ne l'a pas vraiment réussi.

Voici ma fonction d'authentification si vous en avez besoin, donc vous ne l'implémenterez plus, si vous voulez essayer de la coder.

/** 
* Logs in to the Google service using the ClientLogin HttpRequest API and returns an authentification token 
*/ 
private String getAuthToken() { 


HttpClient httpclient = new DefaultHttpClient(); 

HttpPost httppost = new HttpPost(CLIENT_LOGIN_ADDRESS); 

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
nameValuePairs.add(new BasicNameValuePair("accountType", "GOOGLE")); 
nameValuePairs.add(new BasicNameValuePair("Email", "[email protected]")); 
nameValuePairs.add(new BasicNameValuePair("Passwd", "password")); 
nameValuePairs.add(new BasicNameValuePair("service", "wise")); 
nameValuePairs.add(new BasicNameValuePair("source", SERVICE_NAME)); 

try { 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
} 
catch (UnsupportedEncodingException e) { 
    //Log.e("ERROR", "UnsupportedEncodingException"); 
} 

//Log.v("TEST", "Executing request " + httppost.getURI()); 

ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
String responseBody = null; 

try { 
    responseBody = httpclient.execute(httppost, responseHandler); 
} 
catch (ClientProtocolException e) { 
    //Log.e("ERROR", "ClientProtocolException"); 
} 
catch (IOException e) { 
    //Log.e("ERROR", "IOException"); 
} 

//Log.v("TEST", "response:" + responseBody); 

String[] vals = responseBody.split("\n")[2].split("="); 
String auth_string = vals[1]; 
//Log.v("TEST", "auth_token:" + vals[1]); 

return auth_string; 
} 

Voici ce que je suis en train de la fonction de mise à jour, note, de modifier l'URL sont pour mon document ne fonctionnera pas si vous l'essayez, il est juste un IEA sur ce que j'ai jusqu'à présent:

/** 
* Ignore this i use it for testing 
*/ 
public void justTesting() { 

String url = "http://spreadsheets.google.com/feeds/cells/tl7RKkCaAxvO1f3U9Y8k5Dw/od6/private/full/R2C1/1q0cdh"; 

HttpClient httpclient = new DefaultHttpClient(); 

HttpPut httpput = new HttpPut(url); 
httpput.addHeader(new BasicHeader("Authorization", "GoogleLogin auth=" + getAuthToken())); 
httpput.addHeader(new BasicHeader("GData-Version", "2.0")); 

HttpEntity he = null; 

String messageBody = "<entry>"+ 
        "<id>https://spreadsheets.google.com/feeds/cells/tl7RKkCaAxvO1f3U9Y8k5Dw/od6/private/full/R2C1</id>"+ 
        "<link rel=\"edit\" type=\"application/atom+xml\""+ 
        " href=\"https://spreadsheets.google.com/feeds/cells/tl7RKkCaAxvO1f3U9Y8k5Dw/od6/private/full/R2C1\"/>"+ 
        "<gs:cell row=\"2\" col=\"2\" inputValue=\"300\"/>"+ 
         "</entry>"; 


try { 
    he = new StringEntity(messageBody); 
} 
catch (UnsupportedEncodingException e) { 
    //Log.e("ERROR", "UnsupportedEncodingException"); 
} 

httpput.setEntity(he); 


try { 

    HttpResponse hr = httpclient.execute(httpput); 
    //Log.d("DEBUG", "sl : " + hr.getStatusLine()); 
} 
catch (ClientProtocolException e) { 
    //Log.e("ERROR", "ClientProtocolException"); 
} 
catch (IOException e) { 
    //Log.e("ERROR", "IOException"); 
} 

//Log.v("TEST", "executed"); 

} 

Ceci donne actuellement une requête 400 Bad. Aussi j'essaye de réaliser cela en utilisant Apache HttpClient.

Est-ce que quelqu'un a une idée sur la façon dont cela pourrait être réalisé \ implémenté \ comment je devrais envoyer la requête?

Merci, votre aide sera grandement appréciée.


J'ai fait quelques progrès et écrit ceci:

public void justTesting() { 

String url = "https://spreadsheets.google.com/feeds/cells/tl7RKkCaAxvO1f3U9Y8k5Dw/od6/private/full/R2C1"; 

HttpClient httpclient = new DefaultHttpClient(); 

HttpPut httpput = new HttpPut(url); 
httpput.addHeader(new BasicHeader("Authorization", "GoogleLogin auth=" + getAuthToken())); 
httpput.addHeader(new BasicHeader("GData-Version", "3.0")); 

HttpEntity he = null; 

String messageBody = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gs='http://schemas.google.com/spreadsheets/2006'> <id>http://spreadsheets.google.com/feeds/cells/tl7RKkCaAxvO1f3U9Y8k5Dw/od6/private/full/R2C1 </id> <gs:cell row='2' col='1' inputValue='mouuuuuuuuusee'/> </entry>"; 
    //RequestEntity requestEntity = new StringRequestEntity(xml.toString(), "application/atom+xml", "UTF-8"); 


try { 
    he = new StringEntity(messageBody); 
} 
catch (UnsupportedEncodingException e) { 
    Log.e("ERROR", "UnsupportedEncodingException"); 
} 

httpput.addHeader("Content-Type", "application/atom+xml"); 
httpput.setEntity(he); 


try { 
    HttpResponse hr = httpclient.execute(httpput); 
    Log.d("DEBUG", "sl : " + hr.getStatusLine()); 
} 
catch (ClientProtocolException e) { 
    Log.e("ERROR", "ClientProtocolException"); 
} 
catch (IOException e) { 
    Log.e("ERROR", "IOException"); 
} 

Log.v("TEST", "executed"); 

} 

Maintenant, il me donne un 403 Forbidden. Une idée pourquoi?

Répondre

1

Hey, j'ai tout compris, je manquais ceci:

httpput.addHeader(new BasicHeader("If-Match", "*")); 

et maintenant la fonction ressemble à ceci:

public void justTesting() { 

String url = "http://spreadsheets.google.com/feeds/cells/t9VU1IwRrmG3h-nhI_J2fzg/od6/private/full/R2C1"; 

HttpClient httpclient = new DefaultHttpClient(); 

HttpPut httpput = new HttpPut(url); 
httpput.addHeader(new BasicHeader("Authorization", "GoogleLogin auth=" + getAuthToken())); 
httpput.addHeader(new BasicHeader("GData-Version", "2.0")); 
httpput.addHeader(new BasicHeader("If-Match", "*")); 

HttpEntity he = null; 

String messageBody = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gs='http://schemas.google.com/spreadsheets/2006'> <id>http://spreadsheets.google.com/feeds/cells/tl7RKkCaAxvO1f3U9Y8k5Dw/od6/private/full/R2C1</id> <link rel='edit' type='application/atom+xml' href='http://spreadsheets.google.com/feeds/cells/t9VU1IwRrmG3h-nhI_J2fzg/od6/private/full/R2C1/1en5'/> <gs:cell row='2' col='1' inputValue='mouuuuuuuuusee' /> </entry>"; 

try { 
    he = new StringEntity(messageBody); 
} 
catch (UnsupportedEncodingException e) { 
    Log.e("ERROR", "UnsupportedEncodingException"); 
} 

httpput.addHeader("Content-Type", "application/atom+xml"); 
httpput.setEntity(he); 


try { 
    HttpResponse hr = httpclient.execute(httpput); 
    Log.d("DEBUG", "sl : " + hr.getStatusLine()); 
} 
catch (ClientProtocolException e) { 
    Log.e("ERROR", "ClientProtocolException"); 
} 
catch (IOException e) { 
    Log.e("ERROR", "IOException"); 
} 

Log.v("TEST", "executed"); 

}