404 motivation not found | t_ishidaのブログ

1月/70

1

RESTとAtomPub

能書き

YAPC::AsiaでAtomPubの紹介が有ったので調べ直す事にした。AtomPubはプロトコルとしての定義があるけど、概念の話になりがちになり独自解釈が入り込みまくりと予想されます。突っ込みは大いに歓迎

RESTとAtomPub

REST

Webサーバー原理主義なWebサービスの設計原則のこと。

  • Webサーバー原理主義に設計すること*1
  • 一つのリソースには一つのURIを振ること*2
  • 一つのリソースに対しての操作はHTTPメソッドの”GET”,”POST”,”PUT”,”DELETE”を使用してデータのCRUDを実現すること*3
  • リソース同士の関連は、URIを使って行うこと

図1

CRUD メソッド
C PUT
R GET
U POST
D DELETE

図2

f:id:t_ishida:20080521121623j:image

のように、各リソースには名詞を振る。

例えばusersのURIは、こうなる。

http://any.sns.ne.jp/users

usersの情報が欲しい時のHTTPリクエストはこうする。

GET http://any.sns.ne.jp/users

喫煙しなくて、画像付きの男のデータが欲しい場合はこう

GET http://any.sns.ne.jp/users?smoking=no&photo=yes&sex=male

そうすると、こんなデータが返ってくる

<users type="array">
<user>
<id>1</id>
<name>john</name>
<e-mail>john@foo.bar</e-mail>
<sex>male</sex>
<smoking>no</sex>
<photo location="http://any.sns.ne.jp/albums?owner=1&portrait=1"></photo>
</user>
<user>
<id>2</id>
<name>bob</name>
<e-mail>bob@foo.bar</e-mail>
<sex>male</sex>
<smoking>no</sex>
<photo location="http://any.sns.ne.jp/albums?owner=2&portrait=1"></photo>
</user>
</users>

userの追加はこんなん

PUT http://any.sns.ne.jp/users

.
.
.
(PUTのパラメータに必要な情報を入れる)

userの更新はこんなん

POST http://any.sns.ne.jp/users

.
.
.
(POSTのパラメータに必要な情報を入れる)

つまりWebサーバーを、既存のメソッドを使用してCRUDする単純なデータストアにしてやろう考え方と言うこと。もし本当に、これで色々やろうとしたらフロントエンドは、フルAjaxにするか別アプリが必要だよね。また、この設計のコツとしては、DBを使用する場合は、”1リソースを1テーブル”とかって言う発想だと無理が来るので、パラメータのパターンで、

  • どう言う更新をする?
  • どう言う追加をする?
  • どう言う削除をする?
  • どう言うviewを返す?

と言う、ディスパッチャを設けてやる感じになるんじゃないかと予測

例えば、

PUT http://any.sns.ne.jp/users

.
.
(id=1)
(friend=5ってパラメータがある)

なら、ユーザーの追加じゃなくてユーザー(id=1)とユーザー(id=5)を友達にする。と言う事で、userテーブルじゃなくてfriendテーブルの操作になる。みたいな感じ。*4

package User::Dispather;
sub doService{
##$cgiはCGI.pmじゃなくて、CGIのパラメータをパースしたハッシュね。
my $cgi = shift;

## 実際に作るとしたら、もうちょっとインテリジェンスを
## 感じさせるディスパッチャにしましょう。

##GETで来たらユーザー情報照会
$cgi->{GET} and
return User::showUser( $cgi );

##POSTでpasswordが有る場合にはユーザー情報更新
$cgi->{POST}{password}      and
return User::updUser( $cgi );

##POSTでwriterがある場合には、対象ユーザー宛てのメッセージの追加
$cgi->{POST}{writer} and
return User::addMessage( $cgi );

##PUTでidとfriendがある場合には、friend関係の作成
$cgi->{PUT}{id} and $cgi->{PUT}{friend} and
return User::addFriend( $cgi );

##上の場合じゃなくてPUTの場合には、userの追加
$cgi->{PUT} and
return User::addUser( $cgi );
}
sub addFriend { do something }
sub addUser   { do anything }
sub addMessage{ do it }

あー、やる気が尽きたので、AtomPubについてはまたあとで。

一時保存ね。

*1:セッション使ったりCookieを使ったらもうRESTじゃないらしい

*2:でも、URLリライトは禁止らしい

*3:図1参照 なお、GETは副作用のあるメソッドとして使う事は禁止らしい

*4:あくまで例示なので、friendsリソースを別個作るべきとかの突っ込みは不要ね。

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< 色々自動化したいと考え中

Find it!

Theme Design by devolux.org

Tag Cloud