2012-03-13 179 views
4

我遇到在這篇文章中描述了同樣的問題只能更新事件:谷歌日曆API一旦

Google Calendar api v3 re-update issue

也就是說,一旦創建活動,並使用谷歌日曆API更新一次它(v3),我不能再更新活動。當我嘗試時,我得到一個400 - 無效的價值迴應。 (FWIW我正在使用PHP)。

繼我在上面引用的帖子中提供了一個潛在客戶之後,我試圖用etags解決這個問題(儘管我承認我對它們的工作方式的掌握有限)。基本上,在事件更新時,API會在其響應中返回一個etag,我現在將其保存在我的數據庫中。那麼對於後續的(N> 1)更新,我拉電流ETAG從數據庫中,並將其包括在HTTP標頭:

Content-Type: application/json 
Authorization: OAuth [token] 
If-Match: [etag] 

在此之前,根據「更新條目」頭位置信息:http://code.google.com/apis/gdata/docs/2.0/reference.html#ResourceVersioning

旁註:在上面的google參考文獻中,If-Match標頭顯示爲

If-Match: "S0wCTlpIIip7ImA0X0QI" 

帶有雙引號的etag。我用雙引號將etags保存在數據庫中,正如我在第一次更新響應中收到它們一樣。使用curl_setopt/HTTPHEADER添加到標題時,是否需要轉義引號或任何內容?

儘管執行此etag If-Match事件,我仍然得到相同的400 - 無效的值響應。我知道我的請求體是有效的,因爲第一次更新正常。圍繞後續更新還有一些額外的問題。

任何幫助非常感謝。

+0

你下面哪個說「進行更新要使用的if-match,通過獲取您要更新條目開始的條目說明進行對條目進行任何所需的更改,然後創建一個包含修改條目的新PUT請求。「 – 2012-03-16 02:22:31

+0

感謝您的跟進。我剛剛結束了實施「更新」,刪除了現有活動並創建了一個新活動。 – 2012-03-19 15:43:12

回答

14

確保在更新事件時遞增序號字段。

+0

yess你應該遞增序列號並將它與更新請求一起發送 – 2013-03-22 14:38:50

+0

谷歌真的應該提到這個字段是以後需要更新的文檔https://developers.google.com/google-apps/calendar/v3/reference /事件/更新 – TaeKwonJoe 2014-09-05 00:14:29

0

我有同樣的問題。要增加序列號,您需要跟蹤已完成的更新次數,並在更新中包含下一個增量。出於某種原因,第一次更新不需要這個,但後續更新確實需要它。

使用您的月2日更新的事件谷歌的PHP庫會是這個樣子(減去其他任何你正在更新):

$calendarID = ID_OF_YOUR_CALENDAR; 
$eventID = ID_OF_YOUR_EVENT; 

$event = new Google_Event(); 
$event->setSequence('2'); 

$calEvent = $cal->events->update($calendarID $eventID, $event); 
0

這就是我要做的事。從Google獲取條目,以便它已經具有最新的Etag集合並將序列增加1並更新條目。

當我用java所以下面是用java一個例子:

com.google.api.services.calendar.model.Event googleCalendarEvent = service.events().get(clientCalendarEvent.getCalendar().getCalendarKey(),clientCalendarEvent.getEventKey()).execute(); 
updateGoogleCalendarEvent(clientCalendarEvent, googleCalendarEvent); 

googleCalendarEvent.setSequence(googleCalendarEvent.getSequence() + 1); 

com.google.api.services.calendar.model.Event event = service 
     .events() 
     .update(clientCalendarEvent.getCalendar().getCalendarKey(), clientCalendarEvent.getEventKey(), 
      googleCalendarEvent).execute();