ブログ  前の記事  次の記事  2008-04-16 

たけまる / 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

一言メッセージをこっそり送信できます (非公開)
 今年の西暦→