たけまる / AtomPub のエラー処理について
2008-04-16
_
AtomPub のエラー処理について [atompub]



daiba さんから召還されたので,あんまり書くこともないのですが,AtomPub のエラー処理について簡単に説明します.
エラーについて AtomPub 仕様 が定めていることはほとんどありません.
- HTTP 仕様に従ってステータスコードを正しく使うように
- エラー時は 4xx, 5xx を返すように
- PUT においてバージョン違反 (ETag の不一致など) があったときは
412 Precondition Failed を返す
- 認証やアクセス制御のエラーは 401 Unauthorized や 403
Forbidden を返す
- 人間が読めるようなエラーの説明を含めるべきである
これだけです.レスポンスの書式については何も定めていません.
というわけで,AtomPub クライアントができることは,
- ステータスコードでエラーの有無を判断する
- エラー (4xx, 5xx) であれば,レスポンスを出力して人間の判断を仰ぐ
ことだけです.これ以上のことをしたければ,仕様を拡張してサーバとク
ライアントの間で合意しておく必要があります.
強いて言えば,すべての AtomPub クライアントは Atom Entry 形式のレ
スポンスを解析できるので,エラーレスポンスも Atom Entry 形式にして
おくといいかもしれません.
Catalyst::Controller::Atompub では次のようにしてエラーを返していま
す.
HTTP/1.1 412 Precondition Failed <?xml version="1.0" ?> <entry xmlns="http://www.w3.org/2005/Atom"> <link rel="related" href="http://exmaple.com/collection/123.atom"/> <updated>2008-01-01T00:00:00Z</updated> <title>412 Precondition Failed</title> <author><name/></author> <content>ETag not matched</content> </entry>
というようなことが,WEB+DB PRESS で yohei さんが連載している記事に
書いてあった気がします (手元にないので確認してませんが).詳しくは
そちらをみてください (ぉ
■ 召還の呪文について
で,召還の呪文になったページに戻ります.
masuidrive on rails - レスポンスコードでステータスを判断するとFreeSpotとかで問題にならない?
FreeSpotなんかで、アクセスすると初回アクセス時にどのページにアクセ
スしてもログインページなどに飛ばされるようにってるけど、そういう環
境では、APIにPOSTして200が帰ってきても、実は届いてなかったという事
が考えられる。
FreeSpot を使ってないので状況が正確にわからないのですが,AtomPub の
話ではなくて,回線レベルの認証のことですよね? AtomPub の文脈で書か
れてますが,他の API を採用しても同じ問題があるような気がします.
UserAgent の立場からみれば,下位レイヤで起こった事態を直接検知する
ことはできません.たとえば,hosts ファイルが書き換えられたのと同じ
ようなものです.検知するためには,masuidrive さんが 後続のエントリ
で書かれているように,サーバを認証して間接的に検知するしかないと思
います.
というように,一応,AtomPub 固有の問題ではないのでは? と断りを入れ
た上で,もうちょっと突っ込んでみます.
AtomPub のレスポンスは,エラーがなければ以下のいずれかになります.
| HTTPメソッド | ステータスコード |
| GET | 200 OK or 304 Not Modified |
| POST | 201 Created |
| PUT/DELETE | 200 OK or 204 No Content |
つまり,これ以外のパターンが返ってきたときにはエラーと判断していい
のではないでしょうか.上の例のように "POST して 200 が返ってきた"
というのは,AtomPub 的にはあり得ないです.
やや例外的な状況も考慮すると,301 Moved Permanently や 302 Found が
返ってくることはあるかも.202 Accepted や 206 Partial Content もあ
り得なくはないけど,あんまり考えなくていい気がする.複数リソースを
まとめて POST したときは,207 Multi Status が返ってくるかもしれませ
ん [2008-03-29-1].
そんなとこです.
■ GData との互換性
AtomPub と GData では,エラーの扱いはほとんど同じです.どちらもス
テータスコードを基準にエラーを判断します.ただし,AtomPub の 412
Precondition Failed は,GData では 409 Conflict になります.
AtomPub はバージョンチェックを If-Match ヘッダなどで行っているのに
対し,GData は URI で行っています.If-Match の場合は前提条件が崩れ
たということで 412 を返すのが正しく,それ以外の状態の衝突は 409 が
正しい,という理屈になります.
GData については次のページを見てください.
たけまる - GData/Protocol
