REST Best Practices
YAMAMOTO Yohei
http://yohei-y.blogspot.com
REST をどう使うか
- 設計の参考として
- Web システムの理解促進に
- ボキャブラリの共有として
- 「それステートレス?」
- 「統一インターフェース使おうよ」
Web システム
- Web を使ったシステム
- Web アプリケーション(UI)
- Web サービス
- 両者を分ける意味はあまりない
- むしろ分けずに済ますほうがよい
- microformats
- 人にもプログラムにもやさいしい XHTML
- むしろ分けずに済ますほうがよい
どうすればクールになるのか?
- 1 変えない
- 2 変えにくくする
- 3 変わったらリダイレクト
- 4 あきらめる
REST 的には
- URI はクライアントに不透明
- クライアントが URI をいじったり推測するしかないのはダメ(密結合)
- リンクをたどる
- Form から query を投げる
- URI template
- opensearch の {searchTerms}
- query params 以外をテンプレート化
- http://www.ietf.org/internet-drafts/draft-gregorio-uritemplate-00.txt
- まだどうなるかわからない
1 URI まとめ
- 変えないのが重要
- 変えにくくする工夫
- tkawa さんの map.resources 解説に期待
件数取得API リクエスト
POST /xmlrpc HTTP/1.1 Host: b.hatena.ne.jp Content-Type: text/xml <methodCall> <methodName>bookmark.getCount</methodName> <params> <param> <value><string>http://d.hatena.ne.jp/</string></value> </param> <param> <value><string>http://b.hatena.ne.jp/</string></value> </param> <param> <value><string>http://www.hatena.ne.jp/</string></value> </param> </params> </methodCall>
件数取得API レスポンス
HTTP/1.1 200 OK Content-Type: text/xml Content-Encoding: gzip <?xml version="1.0" encoding="us-ascii"?> <methodResponse> <params> <param> <value> <struct> <member> <name>http://www.hatena.ne.jp/</name> <value><int>157</int></value> </member> <member> <name>http://b.hatena.ne.jp/</name> <value><int>198</int></value> </member> <member> <name>http://d.hatena.ne.jp/</name> <value><int>35</int></value> </member> </struct> </value> </param> </params> </methodResponse>
REST 的にどうするか
- query document を POST
- 201 レスポンスと Location ヘッダ
改善後リクエスト
POST /atom/exist HTTP/1.1 Host: b.hatena.ne.jp Content-Type: application/xml <uri-list> <uri>http://d.hatena.ne.jp/naoya/20051212</uri> <uri>http://yohei-y.blogspot.com</uri> </uri-list>
POST /atom/exist HTTP/1.1 Host: b.hatena.ne.jp Content-Type: application/x-www-form-urlencoded uri0=http://d.hatena.ne.jp/naoya/20051212&uri1=http://yohei-y.blogspot.com
改善後レスポンス
HTTP/1.1 201 Created Content-Type: application/atom+xml Location: http://b.hatena.ne.jp/atom/exist/1234567890abcdefg <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>はてなブックマーク検索結果</title> <link rel="self" type="application/atom+xml" href="http://b.hatena.ne.jp/atom/exist/1234567890abcdefg"/> <updated>2003-12-13T18:30:02Z</updated> <author><name>Hatena</name></author> <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id> <entry> <title>なおやのはてなダイアリー</title> <link href="http://d.hatena.ne.jp/naoya/20051212"/> <link rel="alternate" href="http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/naoya/20051212"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2005-12-13T18:30:02Z</updated> <summary>5</summary> <content type="xhtml"> <!-- リンク、キーワード、タグなんかをそのまま入れる --> </content> </entry> <entry> <title>yohei-y:weblog</title> <link href="http://yohei-y.blogspot.com"/> <link rel="alternate" href="http://b.hatena.ne.jp/entry/http://yohei-y.blogspot.com"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2005-12-10T10:34:02Z</updated> <summary>4</summary> <content type="xhtml"> <!-- リンク、キーワード、タグなんかをそのまま入れる --> </content> </entry> </feed>
レスポンスは JSON でも JSONP でも
HTTP/1.1 201 Created Content-Type: application/json Location: http://b.hatena.ne.jp/atom/exist/1234567890abcdefg { "http://d.hatena.ne.jp/naoya/20051212": 5, "http://yohei-y.blogspot.com" : 4 }
良い例 ブックマーク数を画像で取得する API
リクエスト(ブックマーク数リソース)
GET /entry/image/http://d.hatena.ne.jp HTTP/1.1 Host: b.hatena.ne.jp
レスポンス
HTTP/1.1 200 OK Content-Type: image/png binary data
本当の動きは
HTTP/1.1 302 Moved Temporarily Location: http://b.hatena.ne.jp/images/users/normal/00036.png
GET /users/normal/00036.png Host: b.hatena.ne.jp
HTTP/1.1 200 OK Content-Type: image/png Etag: "d7a218-1f9-f35b8700" binary data
画像をGETするとキャッシュにヒット
GET /users/normal/00036.png Host: b.hatena.ne.jp If-Modified-Since: Fri, 07 Jul 2006 08:54:03 GMT If-None-Match: "d7a218-1f9-f35b8700"
HTTP/1.1 304 Not Modified Content-Type: image/png Etag: "d7a218-1f9-f35b8700"
はてなブックマークAPIの分析
- 件数取得の敗因(推測)
- 初めにメソッドコール的に考えた?
- フォーマットで悩んでしまった
- 画像取得の勝因(推測)
- img 要素からの利用(リンク)が念頭に?
Web API 設計のヒント(2)
2 Web API の設計
- おわり
最近の REST 関係の話題(2)
- blog で対話形式がはやってます
- REST Dialogues by Duncan Cragg
- 9個の予定(現状二つ)
- The S stands for Simple by Pete Lacey
- ほとんど訳したんだけど最後の一文が訳せず挫折中orz
- REST Dialogues by Duncan Cragg
最近の REST 関係の話題(3)
- インタビュー at infoQ
- Tim Bray
- DHH
REST vs SOAP/WS-*(ROA vs SOA)
- 表面的な違い
- 仕様の数
- 大ベンダの思惑
- 本質的な違い
- 統一インターフェース vs 個別インターフェース
- 複雑な MEP (Message Exchange Pattern) が必要かどうか
ご静聴ありがとうございました
質問ありますか?