9. HTTP Methods for Distributed Authoring (分散オーサリングのためのHTTPメソッド)
本章では、WebDAVによって定義されたHTTPメソッドと既存のHTTPメソッドの拡張について説明します。
WebDAVメソッド概要
| メソッド | 目的 | 対象 |
|---|---|---|
| PROPFIND | リソースプロパティの取得 | リソースまたはコレクション |
| PROPPATCH | リソースプロパティの変更 | リソース |
| MKCOL | コレクションの作成 | 未マップURL |
| COPY | リソースのコピー | ソースと宛先 |
| MOVE | リソースの移動/名前変更 | ソースと宛先 |
| LOCK | リソースのロック | リソースまたはコレクション |
| UNLOCK | リソースのロック解除 | ロックされたリソース |
9.1 PROPFIND メソッド
PROPFINDは、Request-URIで識別されるリソースに定義されたプロパティを取得します。
リクエストタイプ:
- propname: すべてのプロパティ名を取得
- allprop: すべてのプロパティを取得
- prop: 特定のプロパティを取得
- allprop + include: すべてのプロパティと追加のプロパティを取得
リクエスト例:
PROPFIND /file HTTP/1.1
Host: example.com
Depth: 0
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:displayname/>
<D:getcontentlength/>
</D:prop>
</D:propfind>
レスポンス: プロパティ値を含む207 Multi-Status
Depthヘッダー:
Depth: 0- 対象リソースのみDepth: 1- 対象と直接メンバーDepth: infinity- 対象とすべての子孫
9.2 PROPPATCH メソッド
PROPPATCHはリソースのプロパティを変更します。
操作:
- set: プロパティの作成または更新
- remove: プロパティの削除
例:
PROPPATCH /file HTTP/1.1
Host: example.com
<?xml version="1.0" encoding="utf-8" ?>
<D:propertyupdate xmlns:D="DAV:">
<D:set>
<D:prop><D:displayname>新しい名前</D:displayname></D:prop>
</D:set>
<D:remove>
<D:prop><D:author/></D:prop>
</D:remove>
</D:propertyupdate>
原子性: すべての操作はまとめて成功または失敗しなければなりません (MUST)。
9.3 MKCOL メソッド
MKCOLは、Request-URIに新しいコレクションリソースを作成します。
例:
MKCOL /new-collection/ HTTP/1.1
Host: example.com
要件:
- Request-URIは未マップURLでなければなりません (MUST)
- 親コレクションが存在しなければなりません (MUST)
- リクエストボディは空であるべきです (SHOULD)
ステータスコード:
- 201 Created - コレクションが正常に作成された
- 403 Forbidden - URLにリソースが既に存在する
- 409 Conflict - 親コレクションが存在しない
9.4 コレクションに対するGET、HEAD
コレクションに適用されると、GETとHEADは以下を返すことができます (MAY):
- HTMLディレクトリリスト
- コレクションメンバーリスト
- 空のボディ
動作は実装固有です。
9.5 コレクションに対するPOST
コレクションに対するPOSTは、メンバーを追加するために使用されます。サーバーが新しいメンバーのURLを決定します。
9.6 DELETE メソッド
DELETEは、Request-URIで識別されるリソースを削除します。
コレクションの場合:
- コレクションとすべてのメンバーを再帰的に削除
- Depth: infinityヘッダーが省略された場合、動作はDepth: infinityと同等
部分失敗: いずれかのメンバーの削除が失敗した場合、操作全体が失敗します(原子性が必要)。
9.7 PUT メソッド
PUTはリソースを作成または更新します。
書き込みロックとの相互作用:
- ターゲットがロックされている場合、クライアントは
Ifヘッダーで適切なロックトークンを送信しなければなりません (MUST) - 未マップURLでLOCKが使用された場合、ロックヌルリソースを作成
9.8 COPY メソッド
COPYは、ソースリソースの複製を宛先に作成します。
ヘッダー:
- Destination: ターゲットURL(必須)
- Depth: 0またはinfinity(デフォルト:infinity)
- Overwrite: T(true)またはF(false)(デフォルト:T)
例:
COPY /source HTTP/1.1
Host: example.com
Destination: http://example.com/dest
Overwrite: F
動作:
- リソースコンテンツとデッドプロパティをコピー
- ライブプロパティはその定義に従って処理
- コレクションのコピーは再帰的(Depth: infinity)
- ロックはコピーされない
ステータスコード:
- 201 Created - 宛先が作成された
- 204 No Content - 宛先が上書きされた
- 207 Multi-Status - 部分的成功
- 412 Precondition Failed - Overwrite: Fで宛先が存在
9.9 MOVE メソッド
MOVEは論理的にCOPY + DELETEと同等です。
例:
MOVE /old-location HTTP/1.1
Host: example.com
Destination: http://example.com/new-location
動作:
- リソースを宛先に移動
- リソースを参照するすべてのURLを更新
- プロパティは保持される
- ソースのロックは削除される
- 移動後、宛先はロックされない
原子性: MOVE操作は原子的でなければなりません (MUST)。
9.10 LOCK メソッド
LOCKはリソースにロックを取得します。
ロックタイプ:
- 排他書き込みロック: 1つのプリンシパルのみが保持可能
- 共有書き込みロック: 複数のプリンシパルが保持可能
例:
LOCK /resource HTTP/1.1
Host: example.com
Timeout: Second-3600
<?xml version="1.0" encoding="utf-8" ?>
<D:lockinfo xmlns:D="DAV:">
<D:lockscope><D:exclusive/></D:lockscope>
<D:locktype><D:write/></D:locktype>
<D:owner>
<D:href>http://example.com/user</D:href>
</D:owner>
</D:lockinfo>
レスポンス: ロックトークンを含むlockdiscoveryプロパティを持つ200 OK。
ロックリフレッシュ: Ifヘッダーにロックトークンを含め、ボディなしでLOCKを送信。
9.11 UNLOCK メソッド
UNLOCKは、ロックトークンで識別されるロックを削除します。
例:
UNLOCK /resource HTTP/1.1
Host: example.com
Lock-Token: <opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>
要件:
- Lock-Tokenヘッダーにロックトークンを含める必要があります (MUST)
- ロック作成者または特権プリンシパルのみがロック解除可能
ステータスコード:
- 204 No Content - ロックが正常に削除された
- 409 Conflict - リソースがロックされていなかった
- 423 Locked - 異なるトークンでロックされている
完全なメソッド仕様、エラー処理、詳細な例については、RFC 4918のセクション9.1-9.11を参照してください。