CalDAVでイベントの追加/更新/削除 - PUT/DELETEメソッドの使い方

前の記事で、CalDAVの参照メソッドREPORTについて説明しましたが、その続きで更新系メソッドについてまとめたいと思います。
CalDAVは、WebDAVの拡張プロトコルですので、イベントの追加と更新はPUTメソッドを使ってicsファイルをアップロードします。削除はDELETEメソッドを利用します。

前回説明するのを忘れていましたが、CalDAVメソッドを直接試すには、Fiddlerが便利です。
Fiddlerは、Windows版のみですが、HTTPプロトコルを手で入力して試せます。また、IEプラグインとして通信をデバッグすることができるので何かと便利です。
ダウンロードページからexeファイルをダウンロードできるので、インストーラを起動して、ウィザードに沿って進んでいけばインストールは完了します。

イベントの追加

イベントの追加は、PUTメソッドを使います。
リクエストボディには、追加するイベントVEVENTを含むカレンダーVCALENDARを指定します。

PUT https://www.google.com/calendar/dav/hrendoh@gmail.com/events/20010712T182145Z-123401@google.com.ics HTTP/1.1
Host: www.google.com
Content-Type: text/calendar; charset="utf-8"
Authorization: Basic xxx
Content-Length: 258

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VEVENT
UID:20010712T182145Z-123401@google.com
DTSTAMP:20100426T160000Z
DTSTART:20100426T170000Z
DTEND:20100426T180000Z
SUMMARY:Fiddlerから追加
END:VEVENT
END:VCALENDAR

上記のPUTリクエストをFiddlerでは、以下の手順で実行します。

追加なのでレスポンスコードは201が返されます。

HTTP/1.1 201 Created
DAV: 1, calendar-access, calendar-schedule, calendar-proxy
Content-Type: text/calendar; component=vevent; charset=UTF-8
Date: Sat, 24 Apr 2010 14:02:43 GMT
Expires: Sat, 24 Apr 2010 14:02:43 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Content-Length: 0
Server: GSE

Google Calendarで確認して見ます。ちゃんと登録されてますね。

時刻はUTCで入力したので、JSTに直されて次の日の2:00から3:00になってしまっています。

UIDとファイル名について

UIDは、コレクション(WebDAVのフォルダ)内でユニークな値を指定します。
また、PUTするカレンダーのファイル名は.icsにするのが通例のようです。Google Calendarも、Google Calendarから追加したイベントをREPORTメソッドで取得すると、結果の各イベントのファイル名は.icsというファイル名なっています。ファイル名は、WebDAVのhref要素で確認できます。
(ただし、CalDAVでPUTする場合はUIDとファイル名があってなくても登録できてしまうようです。)

イベントの編集

イベントの編集は、既存のURLに対してPUTを実行します。
追加のリクエストでSUMMARYのみ変更して実行します。

PUT https://www.google.com/calendar/dav/hrendoh@gmail.com/events/20010712T182145Z-123401@google.com.ics HTTP/1.1
Host: www.google.com
Content-Type: text/calendar; charset="utf-8"
Authorization: Basic xxx
Content-Length: 258

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//CalDAV Client//EN
BEGIN:VEVENT
UID:20010712T182145Z-123401@google.com
DTSTAMP:20100426T160000Z
DTSTART:20100426T170000Z
DTEND:20100426T180000Z
SUMMARY:Fiddlerから編集
END:VEVENT
END:VCALENDAR

編集成功のレスポンスコードは204です。

HTTP/1.1 204 No Content
DAV: 1, calendar-access, calendar-schedule, calendar-proxy
Date: Sat, 24 Apr 2010 15:24:09 GMT
Server: GSE

Google Calendarで確認。

イベントの削除

イベントの削除はDELETEです。

DELETE https://www.google.com/calendar/dav/hrendoh@gmail.com/events/20010712T182145Z-123401@google.com.ics HTTP/1.1
Host: www.google.com
Content-Type: text/calendar; charset="utf-8"
Authorization: Basic xxx

削除成功のレスポンスコードは204です。

HTTP/1.1 204 No Content
DAV: 1, calendar-access, calendar-schedule, calendar-proxy
Date: Sat, 24 Apr 2010 15:34:18 GMT
Server: GSE

Google Calendarで確認。

予定の調整機能について

CalDAVにおけるイベントの更新は、CalDAV Access (RFC 4791)では、PUT/DELETEメソッドについては特に定義されていないので、実際にはWebDAVでicsファイルを扱っているだけです。
しかし、予定の調整に関する仕様CalDAV Scheduling (draft-desruisseaux-caldav-sched)では、PUTやDELETEメソッドでイベントの更新があった場合の、スケジューリングメッセージのやり取りについての機能が追加されています。
この機能についてと、あと繰り返しイベントの扱いについては、また別途まとめたいと思います。