我遇到了这篇文章中描述的同样的问题:
Google Calendar api v3 re-update issue
也就是说,一旦我创建了一个事件并使用Google Calendar API (v3)更新了一次,我就不能再更新该事件了。当我尝试这样做时,我得到了一个400 - Invalid value响应。(FWIW我在PHP中工作)。
根据我在上面提到的帖子中提供的线索,我尝试使用etags来解决这个问题(尽管无可否认,我对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
Sidenote:在上面的google ref中,If-Match头显示为
If-Match: "S0wCTlpIIip7ImA0X0QI"使用双引号将etag括起来。我使用双引号将etags保存在数据库中,与我在第一个更新响应中收到的etags完全相同。在使用curl_setopt/HTTPHEADER添加到头文件时,是否需要转义引号或其他内容?
尽管实现了etag If-Match,我仍然得到了相同的400 - Invalid value响应。我知道我的请求体是有效的,因为第一次更新运行良好。只是围绕后续更新还有一些额外的问题。
任何帮助都非常感谢。
发布于 2012-11-15 21:11:18
请确保在更新事件时递增序列号字段。
发布于 2014-05-17 02:18:10
我也有同样的问题。要递增序列号,您需要跟踪已完成的更新次数,并在更新中包含下一次递增。出于某些原因,第一次更新并不需要这样做,但后续的更新确实需要这样做。
在事件的第二次更新中使用google 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);发布于 2014-09-06 01:04:03
我就是这么做的。从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();https://stackoverflow.com/questions/9691665
复制相似问题