我遇到了与本文中描述的相同的问题:
谷歌日历api v3重新更新问题
也就是说,一旦我创建了一个事件并使用Google Calendar API(v3)更新了一次,我就无法再更新该事件了。当我尝试这样做时,我会得到一个400-无效值的响应。(FWIW我正在用PHP工作)。
根据我在上面提到的帖子中提供的线索,我试图使用etag来解决这个问题(尽管无可否认,我对它们的工作原理的掌握是有限的)。基本上,在事件更新时,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
旁注:在上面的谷歌参考中,如果匹配的标题显示为
If-Match: "S0wCTlpIIip7ImA0X0QI"
etag周围有双引号。我用双引号将etag保存在数据库中,就像我在第一次更新响应中收到它们一样。使用curl_setopt/HTTPHEADER添加到标头时,是否需要转义引号或其他内容?
尽管实现了这个etag-If-Match的东西,我仍然得到了相同的400-Invalid值响应。我知道我的请求主体是有效的,因为第一次更新运行良好。后续更新还有一些附加问题。
非常感谢您的帮助。
更新事件时,请确保增加序列号字段。
我也遇到了同样的问题。要增加序列号,您需要跟踪已完成的更新次数,并在更新中包括下一个增量。由于某些原因,第一次更新不需要这个,但随后的更新确实需要它
在事件的第二次更新中使用googlephp库会看起来像这样(减去您正在更新的其他内容):
$calendarID = ID_OF_YOUR_CALENDAR;
$eventID = ID_OF_YOUR_EVENT;
$event = new Google_Event();
$event->setSequence('2');
$calEvent = $cal->events->update($calendarID $eventID, $event);
我就是这么做的。从谷歌获取条目,使其已经有了最新的Etag集,然后将序列增加一并更新条目。
当我使用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();