2012-03-13 131 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();