API Календаря Google - можно обновить событие только один раз - PullRequest
4 голосов
/ 14 марта 2012

Я столкнулся с той же проблемой, как описано в этом сообщении:

Проблема повторного обновления API Календаря Google v3

А именно, как только я создаю событие иобновив его один раз с помощью API Календаря Google (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

Sidenote: в приведенной выше ссылке Google, заголовок If-Match показан как

If-Match: "S0wCTlpIIip7ImA0X0QI"

с двойными кавычками вокруг etag.Я сохраняю etags в базе данных с двойными кавычками, точно так же, как я получаю их в ответе на первое обновление.Нужно ли экранировать кавычки или что-то еще при добавлении в заголовок с помощью curl_setopt / HTTPHEADER?

Несмотря на реализацию этого etag-элемента If-Match, я все еще получаю тот же ответ 400 - Неверное значение.Я знаю, что мои тела запросов действительны, потому что первое обновление работает нормально.Есть только некоторые дополнительные проблемы, связанные с последующими обновлениями.

Любая помощь очень ценится.

Ответы [ 3 ]

14 голосов
/ 15 ноября 2012

Обязательно увеличивайте поле порядкового номера при обновлении событий.

0 голосов
/ 05 сентября 2014

Вот как я это делаю. Извлеките запись из Google, чтобы в ней уже был установлен последний 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();
0 голосов
/ 16 мая 2014

У меня была такая же проблема. Чтобы увеличить порядковый номер, вам необходимо отслеживать, сколько обновлений вы сделали, и включать следующий шаг в свое обновление. По некоторым причинам первое обновление не требует этого, но последующие обновления требуют этого.

Использование библиотеки 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);
...