2

Я пытаюсь реализовать некоторые основные функции для таблиц Google, , используя спецификацию протокола с запросами.Обновление API электронной таблицы Google edit с протоколом

Причина, по которой я делаю это, потому что она предназначена для Android, а gdata-java-библиотека действительно не работает, и альфа-андроид на самом деле ее не режет. Мне удалось реализовать аутентификацию, получить списки и удалить, но для редактирования \ обновления строки я не могу обдумать ее.

Например я хочу изменить содержимое ячейки here является спецификация протокола

Из моего понимания этого, я должен послать какой-то атом или XML форматированный запрос редактирования URL. Я никогда не отправлял такие запросы.

Я также нашел this, в котором дается ключ к вопросу о том, как это должно быть сделано (также нерешенный вопрос на форуме), но на самом деле это не удалось.

Вот моя функция аутентификации, если вам это нужно, поэтому вы не реализуете ее снова, если хотите попытаться ее кодировать.

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

Вот что я пытаюсь как функция обновления, заметки, редактировать URL, которые для меня документ не будет работать, если вы попробуете это, это просто для ИЭЭ на то, что я до сих пор:

/** 
* 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"); 

} 

Это в настоящее время дает 400-кратный запрос. Также я пытаюсь достичь этого с помощью Apache HttpClient.

Кто-нибудь имеет представление о том, как это может быть достигнуто \ реализовано \ как какой запрос я должен отправить?

Спасибо, ваша помощь будет принята с благодарностью.


Я сделал некоторый прогресс и написал:

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"); 

} 

Теперь он дает мне 403 Forbidden. Любая идея почему?

ответ

1

Эй, я понял это, я был в этом отсутствует:

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

и теперь функция выглядит следующим образом:

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"); 

}