2012-03-13 22 views
4

は、私がこの記事で説明したのと同じ問題が発生したらイベントを更新することができます。私は、イベントを作成したら、GoogleカレンダーAPIのみ

Google Calendar api v3 re-update issue

つまり、一度GoogleカレンダーのAPIを使用して、それを更新(v3)、私はもはやイベントを更新することができません。私がしようとすると、私は400 - 無効な値の応答を取得します。 (私はPHPで働いているFWIW)。

私が上で参照したポストで提供されたリードに続いて、私はetagsを使って問題を解決しようとしました(しかし、彼らの仕事は限られています)。基本的に、イベントの更新時に、APIはレスポンスにetagを返します。これをデータベースに保存します。その後の(N> 1)を更新するために、私は、データベースから現在のETagを引き、HTTPヘッダに含める:http://code.google.com/apis/gdata/docs/2.0/reference.html#ResourceVersioning

Content-Type: application/json 
Authorization: OAuth [token] 
If-Match: [etag] 

これは、「更新エントリ」ここでヘッダの下に情報を以下Sidenote:上記のGoogle refでは、If-Matchヘッダーは

If-Match: "S0wCTlpIIip7ImA0X0QI" 

のように表示されます。私は二重引用符でデータベースにetagsを保存しています、まさに最初の更新応答でそれらを受け取ります。 curl_setopt/HTTPHEADERを使用してヘッダに追加するときに引用符などをエスケープする必要がありますか?

このetag If-Matchの実装にもかかわらず、私はまだ同じ400 - 無効な値の応答を得ています。最初のアップデートがうまく動作するので、私のリクエストボディが有効であることを知っています。その後のアップデートを取り巻くいくつかの追加の問題があります。

ご迷惑をおかけして申し訳ございません。

+0

あなたがマッチした場合-、あなたが更新しているエントリを取得することによって開始使用してエントリを更新するには」と言うの指示に従ってください。エントリに対する任意の変更を行い、変更されたエントリを含む新しいPUT要求を作成します。 –

+0

フォローアップしていただきありがとうございます。私はちょうど私が既存のイベントを削除し、新しいものを作成する "更新"を実装してしまった。 –

答えて

14

イベントを更新するときは、必ずシーケンス番号フィールドを増やしてください。

+0

yessあなたはシーケンス番号を増やして、それをupdate req –

+0

と一緒に送信する必要があります。このフィールドは、ドキュメンテーションの後続の更新に必要です。https://developers.google.com/google-apps/calendar/v3/reference/events/update – TaeKwonJoe

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); 
0

私はそれを行う方法であること。すでに最新のEtagが設定されているので、シーケンスを1つ増やしてエントリを更新するように、Googleからエントリを取得します。

私は次の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(); 
関連する問題