XML::Atom::Server を使って Atom API サーバを実装実験中。気づいたことメモ。
XML::Atom::Server ではWSSE認証のために password_for_user
というメソッドを実装して、
sub password_for_user { my($self, $username) = @_; return $password; }
みたいにする必要あり。ユーザの入力に password は含まれず、種 (Nonce + created) と PasswordDigest があるだけなので、パスワードがサーバ側でわからないとだめです。メソッドで password を文字列で返すってのが実装的には気持ちよくないんですが、まあこれがラクでいいのかな。別サーバとかにある場合は authenticate
そのものをオーバーライドしてやればいいとおもわれます。
パラメータの解釈には PATH_INFO を使用しています。
GET /atomapi/blog_id=12/entry_id=13
みたいなリクエストから
$VAR1 = { blog_id => 12, entry_id => 13, };
みたいなハッシュをパラメータとしてつくります。これは Atom API の Spec ではなく XML::Atom::Server の独自拡張だと思われます。
TypePad Atom API にあるような、URI から実装メソッドへのマッピングを行うのは結構しんどいです。request_method の GET / POST / PUT / DELETE と、PATH_INFO からとったパラメータ ($self->{params} でとれる) をひたすら if .. elsif で判定して実装メソッドに dispatch してあげる必要アリ。具体的には、
みたいになります(メソッド名は任意。もう少しエレガントにならんのかな。
handle_request
メソッドで、レスポンスのXMLを生成して返しますがここが抽象化されていません。生のXML文書を文字列で返すAPIです。自分は「実装メソッド名.xml」なファイルを テンプレートで読み込んで吐き出すようにラッパーつくってみましたが。
まだまだ未成熟なAPIなので、ツールも使いにくい状態です。いろいろいじって、XML::Atom の方にもフィードバックしていきたいですな。