Google Calendar API - 只能更新一次事件

时间:2012-03-13 20:34:03

标签: http curl http-headers google-api google-calendar-api

我遇到了与本文所述相同的问题:

Google Calendar api v3 re-update issue

即,一旦我使用Google Calendar 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 ref中,If-Match标题显示为

If-Match: "S0wCTlpIIip7ImA0X0QI"

在etag周围加上双引号。我用双引号将etags保存在数据库中,就像我在第一次更新响应中收到它们一样。使用curl_setopt / HTTPHEADER添加到标题时,是否需要转义引号或其他内容?

尽管实现了这个etag If-Match的事情,我仍然得到相同的400 - 无效的值响应。我知道我的请求主体是有效的,因为第一次更新工作正常。围绕后续更新还有一些其他问题。

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:14)

确保在更新事件时增加序列号字段。

答案 1 :(得分:0)

我有同样的问题。要增加序列号,您需要跟踪已完成的更新数量,并在更新中包含下一个增量。出于某种原因,第一次更新并不需要这样,但后续更新确实需要它。

在第二次更新事件时使用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);

答案 2 :(得分: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();