SlideShare a Scribd company logo
RESTful Web アプリの
   設計レビューの話


  和田 卓人 (a.k.a id:t-wada or @t_wada)
    July 23, 2012 @ sendagaya.rb
結論:
REST は
麻疹である
(良いものなので早く感染して厨期を
      卒業しよう)
自己紹介
名前:     和田 卓人 (わだ たくと)

ブログ: http://d.hatena.ne.jp/t-wada

メール: takuto.wada@gmail.com

Twitter: http://twitter.com/t_wada

タワーズ・クエスト株式会社
取締役社長
私と REST (input)

• WEB+DB PRESS vol.32「REST
 アーキテクチャスタイル入門」

• はてぶ設計議論
• DHH の RubyKaigi 2006 Keynote
• WEB+DB PRESS vol.38∼「REST
 レシピ」

• 『RESTful Web Service』
私と REST (output)

• Java でいろいろ実装 (JSR311関係)
• WEB+DB PRESS vol.42 「Restlet で動
 かしながら学ぶ REST の世界」執筆

• 動画で配信!「現場で使えるREST」鼎談
• 『Web を支える技術』トークセッション
おことわり:
Rails の話は
あまりしません
(REST の話ばっかりします)
URL 設計レビューを行ったプロジェクト

•規模が大きい rails プロジェクト
  • route 数 1000 以上
•レビューツール
  • ホワイトボード
  • チャット
  • Wiki
  • diff
RESTful アプリ設計のステップ
1. 対象となるデータを認識する

2. 対象となるデータをリソースに分ける

(2 で分けたひとつひとつのリソースに対して)

3. リソースにURLで名前を付ける

4. リソースに対して統一インターフェイスのサブセットを提供する(GET/
   POST/PUT/DELETE をマッピング)

5. クライアントから受信する表現(Representation)を(一つ以上)設計する

6. クライアントに提供する表現を (一つ以上) 設計する

7. ハイパーメディアリンクとフォームを使用して、このリソースを既存のリ
   ソースに統合する (接続性 = Connectedness を高める)

8. 正常系を考える(適切なリクエストがあったとき何が起こるべきか)

9. 例外条件を考える(不適切なリクエストがあったとき何が起こるべきか)
設計レビューで見るポイント

• URL 設計 (動詞、構造、クエリ)
 • CRUD の重力に引かれていないか
• HTTP メソッドの選択
• ステータスコードの選択
• 表現の設計
 • 情報量に過不足は無いか
 • 接続性を満たしているか
URL に動詞が含まれていないか

  GET http://example.com/blog/getEntries
○ GET http://example.com/blog/entries


  POST http://example.com/blog/entries/add
○ POST http://example.com/blog/entries


  POST http://example.com/blog/entries/30/delete
○ DELETE http://example.com/blog/entries/30
URL に動詞が含まれていないか



• add, delete, update =>
• edit => △ (規約による妥協)
• なるべく名詞に近づける努力をする
 • confirm -> confirmation
• 名詞と動詞が同じ形のものは状況による
URL が無理な構造になっていないか

• Tumblr の奇妙な URL
 • http://www.tumblr.com/show/everything/by/me
 • それっぽく読めれば良いというものではない

• example.com/files/copy/:source/:destination =>
 • コピー先はコピー元と従属関係が無い(階層構造は不当)

• URL が右にいくに従って自然な階層構造/サブセットに
  なっているか
URL が無理な構造になっていないか

• URL 設計のほとんどの時間は「名前を探す」ことに費や
 される

  • いつも辞書と共に設計する
• リソースとリソースの関係を表す第三のリソースを探す
   • subscription, belonging, tagging
• リソースは DB レコードだけでは無い
   • トランザクション
   • 計算結果
URL の意味と意思


http://example.com/blog/entries?page=3&lang=ja

          リソースの意味               クライアントの意思




• 「サーバ上の意味」と「どう見たいかという意思」
• ? 以降をすべて取り去っても意味は変わらないか
• ? 以前にリソースの意味と関係ない要素は無いか
CRUD の重力に引かれていないか

• GET/POST/PUT/DELETE を DB の
 SELECT/INSERT/UPDATE/DELETE に
  1:1 に自動的に 対応させるのは思考停止

 • 1:1 とは限らない
 • 多くの意味と表現を持つテーブルもある
    • テーブルの重要度には濃淡がある
 • 従属的で個別の意味と表現を持たないテーブ
  ルもある
CRUD の重力に引かれていないか



• 第3正規形のテーブルと 1:1 の route がある
 のは粒度が細かすぎる

  • N+1 Problem にも容易に突き当たる
• リソースの粒度/視点(つまりは URL)とデータ
 ベースの粒度/視点の違いを解釈してしかるべ
 く結びつけるのが Controller の仕事
HTTP メソッドの選択

• URL で示されるリソースに対して「何をし
 たいか」で GET/POST/PUT/DELETE

  • ここで揉めることは少ない
• GET 重要。とても重要。
• リソースを作る場合
   • URL が新たに作成される場合は POST
   • URL がわかっている場合は PUT
• どうにもならなくなったら POST に倒す
ステータスコードの選択

• 意識的に使用するコードは概ね次のものに収
 束する

 • 200, 201, 204
 • 301, 303, 307, (304)
 • 400, 404, 409, (401, 403)
 • 500
• クライアント側が悪いときは 400 系、サー
 バ側が悪いときは 500 系
ステータスコードの選択




• 例外系 (400/500系) は controller / model
 から投げる例外をステータスコードにマッピ
 ングする(これは rails の話)

• クライアントに対してリソースを隠匿するか
 どうかで 400 系を 404 に倒すこともある
表現の設計

• URL、あるいは URL の作り方(つまり
 フォーム)が含まれていること

  • 袋小路になっていないこと
• GET のパラメータを組み立てさせたいとき
 はフォームを使う (フォームは POST のため
 だけじゃないよ)

• js 側で文字列を結合して URL を作るのでは
 なく、 URI-Templates を渡す

  • http://tools.ietf.org/html/rfc6570
表現の設計



• Content Negotiation
   • Accept や Accept-Language ヘッダ
   • 表現のフォーマットは URL に含められ
    るとなお良い

  • 表現の言語選択(ja,en,...)も URL に含め
    られるとなお良い
接続性ある表現のために


• クライアントは、サービスから送られてくる表現の中に含
 まれているリンク(またはフォーム)を使用することによっ
 てのみ、自分の状態を変更できる(簡単な例を挙げるな
 ら、リンクやフォームによってのみ、画面の状態を変える
 ことができる)

• サービスは、クライアントがURLを組み立てることを強
 制してはならないし、期待してはならない

• サービスは、以上の点をクライアントに無理なく守っても
 らうために、クライアントが次に取り得る状態をすべてリ
 ンク(またはフォーム)の形で表現に含める
議論
議論になるポイント


• やりたいこと vs. (Rails 的な)作りやすさ
• 確認画面、プレビュー画面、完了画面…
• リソースの移動、コピー
• トランザクションの表現
• 複数レコードを選択して更新する UI
   • 207 Multi-Status の誘惑
議論になるポイント

• URL に機械採番の id が含まれる
   • セキュアじゃ無い
   • 永続的でない(かも)
• API のバージョニング
   • 自前でやっていた
  •   https://github.com/bploetz/versionist 良さそう

• rails4 の PATCH メソッドどうよ?
議論になるポイント

• あまり非同期処理に頼らない
   • DOM Scripting の原則に従う
• RESTful なサーバとリッチ js という設計に
 倒しすぎると UX や保守性が低下する可能
 性があるので注意

  • REST 厨がみんな通る道
  • 一方 Twitter はリッチ js から戻した
• 制約をバランスすることこそが設計
参考文献
結論:
REST は
麻疹である
(良いものなので早く感染して厨期を
      卒業しよう)
ご清聴ありがとうございました




        http://lumberjaph.net/graph/2010/03/25/github-explorer.html

More Related Content

What's hot (20)

PDF
REST API のコツ
pospome
 
PDF
わたくし、やっぱりCDKを使いたいですわ〜CDK import編〜.pdf
ssuser868e2d
 
PPTX
脱RESTful API設計の提案
樽八 仲川
 
PDF
OAuth 2.0のResource Serverの作り方
Hitachi, Ltd. OSS Solution Center.
 
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
RESTful API 入門
Keisuke Nishitani
 
PPTX
KeycloakでAPI認可に入門する
Hitachi, Ltd. OSS Solution Center.
 
PDF
CodeBuildを身近にするためのはじめの一歩
淳 千葉
 
PDF
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
PPTX
GraphQLのsubscriptionで出来ること
Shingo Fukui
 
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
PDF
20190522 AWS Black Belt Online Seminar AWS Step Functions
Amazon Web Services Japan
 
PPTX
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
ざっくり解説 LINE ログイン
Naohiro Fujie
 
PPTX
分散トレーシングAWS:X-Rayとの上手い付き合い方
Recruit Lifestyle Co., Ltd.
 
PPTX
Dockerからcontainerdへの移行
Akihiro Suda
 
PPTX
NGINXをBFF (Backend for Frontend)として利用した話
Hitachi, Ltd. OSS Solution Center.
 
PDF
DynamoDBの初心者に伝えたい初めて触るときの勘所
Ryo Sasaki
 
PDF
ブルックスのいう銀の弾丸とは何か?
Yoshitaka Kawashima
 
PDF
Ingressの概要とLoadBalancerとの比較
Mei Nakamura
 
REST API のコツ
pospome
 
わたくし、やっぱりCDKを使いたいですわ〜CDK import編〜.pdf
ssuser868e2d
 
脱RESTful API設計の提案
樽八 仲川
 
OAuth 2.0のResource Serverの作り方
Hitachi, Ltd. OSS Solution Center.
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
RESTful API 入門
Keisuke Nishitani
 
KeycloakでAPI認可に入門する
Hitachi, Ltd. OSS Solution Center.
 
CodeBuildを身近にするためのはじめの一歩
淳 千葉
 
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
GraphQLのsubscriptionで出来ること
Shingo Fukui
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
20190522 AWS Black Belt Online Seminar AWS Step Functions
Amazon Web Services Japan
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
NTT DATA Technology & Innovation
 
ざっくり解説 LINE ログイン
Naohiro Fujie
 
分散トレーシングAWS:X-Rayとの上手い付き合い方
Recruit Lifestyle Co., Ltd.
 
Dockerからcontainerdへの移行
Akihiro Suda
 
NGINXをBFF (Backend for Frontend)として利用した話
Hitachi, Ltd. OSS Solution Center.
 
DynamoDBの初心者に伝えたい初めて触るときの勘所
Ryo Sasaki
 
ブルックスのいう銀の弾丸とは何か?
Yoshitaka Kawashima
 
Ingressの概要とLoadBalancerとの比較
Mei Nakamura
 

Similar to RESTful Web アプリの設計レビューの話 (20)

PDF
Signs;Gate - RESTfulなサイトの作り方 (Gunma.web #6 2011/09/03)
parrotstudio
 
PDF
RESTful #とは RailsスタイルからRESTを学ぼう
Toru Kawamura
 
PPT
OSC2008 Tokyo/Spring REST勉強夜会
Siena. N
 
PDF
RESTとRailsスタイル
Toru Kawamura
 
KEY
BEAR.Sunday Note
Akihito Koriyama
 
PDF
Ruby on Rails Overview
Koki Shimizu
 
PDF
Enterprise Redmine
Dai FUJIHARA
 
PPT
REST 入門
Yohei Yamamoto
 
PDF
リソースモデリングパターンの提案 #sendagayarb
Toru Kawamura
 
PDF
Sails workshop1
Tomokatsu Iguchi
 
PPT
丸山先生レクチャーシリーズ2007-2008
Yoichiro Tanaka
 
PDF
RESTfulとは
星影 月夜
 
PDF
Beginning Java EE 6 勉強会(7) #bje_study
ikeyat
 
PDF
CloudSpiral 2014年度 Webアプリ講義(1日目)
Shin Matsumoto
 
PDF
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Rakuten Group, Inc.
 
PPTX
Fluxflex meetup 2011 in Tokyo
Kyosuke Inoue
 
PDF
20120711 WUM Redmineの使い道_公開版
Yu Nakata
 
PDF
Railsから学ぶRESTfulなuri設計
Kanako Kobayashi
 
PPT
初めての REST - Representational State Transfer
Tatsumi Naganuma
 
PDF
Voicepic@FukuiMASeminar
Manabu Shimobe
 
Signs;Gate - RESTfulなサイトの作り方 (Gunma.web #6 2011/09/03)
parrotstudio
 
RESTful #とは RailsスタイルからRESTを学ぼう
Toru Kawamura
 
OSC2008 Tokyo/Spring REST勉強夜会
Siena. N
 
RESTとRailsスタイル
Toru Kawamura
 
BEAR.Sunday Note
Akihito Koriyama
 
Ruby on Rails Overview
Koki Shimizu
 
Enterprise Redmine
Dai FUJIHARA
 
REST 入門
Yohei Yamamoto
 
リソースモデリングパターンの提案 #sendagayarb
Toru Kawamura
 
Sails workshop1
Tomokatsu Iguchi
 
丸山先生レクチャーシリーズ2007-2008
Yoichiro Tanaka
 
RESTfulとは
星影 月夜
 
Beginning Java EE 6 勉強会(7) #bje_study
ikeyat
 
CloudSpiral 2014年度 Webアプリ講義(1日目)
Shin Matsumoto
 
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Rakuten Group, Inc.
 
Fluxflex meetup 2011 in Tokyo
Kyosuke Inoue
 
20120711 WUM Redmineの使い道_公開版
Yu Nakata
 
Railsから学ぶRESTfulなuri設計
Kanako Kobayashi
 
初めての REST - Representational State Transfer
Tatsumi Naganuma
 
Voicepic@FukuiMASeminar
Manabu Shimobe
 
Ad

More from Takuto Wada (20)

PDF
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
 
PDF
OSS活動の活発さと評価の関係について
Takuto Wada
 
PDF
unassert - encourage reliable programming by writing assertions in production
Takuto Wada
 
PDF
OSS についてあれこれ
Takuto Wada
 
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
PDF
power-assert, mechanism and philosophy
Takuto Wada
 
PDF
アジャイルサムライの次に読む技術書
Takuto Wada
 
PDF
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
 
PDF
テスト用ライブラリ power-assert
Takuto Wada
 
PDF
Reviewing RESTful Web Apps
Takuto Wada
 
PDF
power-assert in JavaScript
Takuto Wada
 
PDF
TDD のこころ @ OSH2014
Takuto Wada
 
PDF
テストを書く文化を育てる戦略と戦術
Takuto Wada
 
PDF
私にとってのテスト
Takuto Wada
 
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada
 
PDF
愛せないコードを書くには人生はあまりにも短い
Takuto Wada
 
PDF
ペアプログラミング ホントのところ
Takuto Wada
 
PDF
例外設計における大罪
Takuto Wada
 
PDF
TDDBC お題
Takuto Wada
 
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
 
OSS活動の活発さと評価の関係について
Takuto Wada
 
unassert - encourage reliable programming by writing assertions in production
Takuto Wada
 
OSS についてあれこれ
Takuto Wada
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
power-assert, mechanism and philosophy
Takuto Wada
 
アジャイルサムライの次に読む技術書
Takuto Wada
 
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
 
テスト用ライブラリ power-assert
Takuto Wada
 
Reviewing RESTful Web Apps
Takuto Wada
 
power-assert in JavaScript
Takuto Wada
 
TDD のこころ @ OSH2014
Takuto Wada
 
テストを書く文化を育てる戦略と戦術
Takuto Wada
 
私にとってのテスト
Takuto Wada
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada
 
愛せないコードを書くには人生はあまりにも短い
Takuto Wada
 
ペアプログラミング ホントのところ
Takuto Wada
 
例外設計における大罪
Takuto Wada
 
TDDBC お題
Takuto Wada
 
Ad

Recently uploaded (6)

PDF
20250717_Devin×GitHubCopilotで10人分の仕事は出来るのか?.pdf
Masaki Yamakawa
 
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
20250711JIMUC総会_先進IT運用管理分科会Connpass公開資料.pdf
ChikakoInami1
 
PDF
Google Driveハブ型Obsidian同期環境:PC編集とモバイル閲覧を安全・効率的に実現するクロスデバイス構築ガイド
honeshabri
 
PDF
20250711JIMUC総会IBM Automation_Platform最新情報_Connpass公開版.pdf
ChikakoInami1
 
PPTX
Devcontainerのススメ(1)-Devcontainerとはどういう技術?-
iPride Co., Ltd.
 
20250717_Devin×GitHubCopilotで10人分の仕事は出来るのか?.pdf
Masaki Yamakawa
 
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
20250711JIMUC総会_先進IT運用管理分科会Connpass公開資料.pdf
ChikakoInami1
 
Google Driveハブ型Obsidian同期環境:PC編集とモバイル閲覧を安全・効率的に実現するクロスデバイス構築ガイド
honeshabri
 
20250711JIMUC総会IBM Automation_Platform最新情報_Connpass公開版.pdf
ChikakoInami1
 
Devcontainerのススメ(1)-Devcontainerとはどういう技術?-
iPride Co., Ltd.
 

RESTful Web アプリの設計レビューの話

  • 1. RESTful Web アプリの 設計レビューの話 和田 卓人 (a.k.a id:t-wada or @t_wada) July 23, 2012 @ sendagaya.rb
  • 3. 自己紹介 名前: 和田 卓人 (わだ たくと) ブログ: http://d.hatena.ne.jp/t-wada メール: [email protected] Twitter: http://twitter.com/t_wada タワーズ・クエスト株式会社 取締役社長
  • 4. 私と REST (input) • WEB+DB PRESS vol.32「REST アーキテクチャスタイル入門」 • はてぶ設計議論 • DHH の RubyKaigi 2006 Keynote • WEB+DB PRESS vol.38∼「REST レシピ」 • 『RESTful Web Service』
  • 5. 私と REST (output) • Java でいろいろ実装 (JSR311関係) • WEB+DB PRESS vol.42 「Restlet で動 かしながら学ぶ REST の世界」執筆 • 動画で配信!「現場で使えるREST」鼎談 • 『Web を支える技術』トークセッション
  • 7. URL 設計レビューを行ったプロジェクト •規模が大きい rails プロジェクト • route 数 1000 以上 •レビューツール • ホワイトボード • チャット • Wiki • diff
  • 8. RESTful アプリ設計のステップ 1. 対象となるデータを認識する 2. 対象となるデータをリソースに分ける (2 で分けたひとつひとつのリソースに対して) 3. リソースにURLで名前を付ける 4. リソースに対して統一インターフェイスのサブセットを提供する(GET/ POST/PUT/DELETE をマッピング) 5. クライアントから受信する表現(Representation)を(一つ以上)設計する 6. クライアントに提供する表現を (一つ以上) 設計する 7. ハイパーメディアリンクとフォームを使用して、このリソースを既存のリ ソースに統合する (接続性 = Connectedness を高める) 8. 正常系を考える(適切なリクエストがあったとき何が起こるべきか) 9. 例外条件を考える(不適切なリクエストがあったとき何が起こるべきか)
  • 9. 設計レビューで見るポイント • URL 設計 (動詞、構造、クエリ) • CRUD の重力に引かれていないか • HTTP メソッドの選択 • ステータスコードの選択 • 表現の設計 • 情報量に過不足は無いか • 接続性を満たしているか
  • 10. URL に動詞が含まれていないか GET http://example.com/blog/getEntries ○ GET http://example.com/blog/entries POST http://example.com/blog/entries/add ○ POST http://example.com/blog/entries POST http://example.com/blog/entries/30/delete ○ DELETE http://example.com/blog/entries/30
  • 11. URL に動詞が含まれていないか • add, delete, update => • edit => △ (規約による妥協) • なるべく名詞に近づける努力をする • confirm -> confirmation • 名詞と動詞が同じ形のものは状況による
  • 12. URL が無理な構造になっていないか • Tumblr の奇妙な URL • http://www.tumblr.com/show/everything/by/me • それっぽく読めれば良いというものではない • example.com/files/copy/:source/:destination => • コピー先はコピー元と従属関係が無い(階層構造は不当) • URL が右にいくに従って自然な階層構造/サブセットに なっているか
  • 13. URL が無理な構造になっていないか • URL 設計のほとんどの時間は「名前を探す」ことに費や される • いつも辞書と共に設計する • リソースとリソースの関係を表す第三のリソースを探す • subscription, belonging, tagging • リソースは DB レコードだけでは無い • トランザクション • 計算結果
  • 14. URL の意味と意思 http://example.com/blog/entries?page=3&lang=ja リソースの意味 クライアントの意思 • 「サーバ上の意味」と「どう見たいかという意思」 • ? 以降をすべて取り去っても意味は変わらないか • ? 以前にリソースの意味と関係ない要素は無いか
  • 15. CRUD の重力に引かれていないか • GET/POST/PUT/DELETE を DB の SELECT/INSERT/UPDATE/DELETE に 1:1 に自動的に 対応させるのは思考停止 • 1:1 とは限らない • 多くの意味と表現を持つテーブルもある • テーブルの重要度には濃淡がある • 従属的で個別の意味と表現を持たないテーブ ルもある
  • 16. CRUD の重力に引かれていないか • 第3正規形のテーブルと 1:1 の route がある のは粒度が細かすぎる • N+1 Problem にも容易に突き当たる • リソースの粒度/視点(つまりは URL)とデータ ベースの粒度/視点の違いを解釈してしかるべ く結びつけるのが Controller の仕事
  • 17. HTTP メソッドの選択 • URL で示されるリソースに対して「何をし たいか」で GET/POST/PUT/DELETE • ここで揉めることは少ない • GET 重要。とても重要。 • リソースを作る場合 • URL が新たに作成される場合は POST • URL がわかっている場合は PUT • どうにもならなくなったら POST に倒す
  • 18. ステータスコードの選択 • 意識的に使用するコードは概ね次のものに収 束する • 200, 201, 204 • 301, 303, 307, (304) • 400, 404, 409, (401, 403) • 500 • クライアント側が悪いときは 400 系、サー バ側が悪いときは 500 系
  • 19. ステータスコードの選択 • 例外系 (400/500系) は controller / model から投げる例外をステータスコードにマッピ ングする(これは rails の話) • クライアントに対してリソースを隠匿するか どうかで 400 系を 404 に倒すこともある
  • 20. 表現の設計 • URL、あるいは URL の作り方(つまり フォーム)が含まれていること • 袋小路になっていないこと • GET のパラメータを組み立てさせたいとき はフォームを使う (フォームは POST のため だけじゃないよ) • js 側で文字列を結合して URL を作るのでは なく、 URI-Templates を渡す • http://tools.ietf.org/html/rfc6570
  • 21. 表現の設計 • Content Negotiation • Accept や Accept-Language ヘッダ • 表現のフォーマットは URL に含められ るとなお良い • 表現の言語選択(ja,en,...)も URL に含め られるとなお良い
  • 22. 接続性ある表現のために • クライアントは、サービスから送られてくる表現の中に含 まれているリンク(またはフォーム)を使用することによっ てのみ、自分の状態を変更できる(簡単な例を挙げるな ら、リンクやフォームによってのみ、画面の状態を変える ことができる) • サービスは、クライアントがURLを組み立てることを強 制してはならないし、期待してはならない • サービスは、以上の点をクライアントに無理なく守っても らうために、クライアントが次に取り得る状態をすべてリ ンク(またはフォーム)の形で表現に含める
  • 24. 議論になるポイント • やりたいこと vs. (Rails 的な)作りやすさ • 確認画面、プレビュー画面、完了画面… • リソースの移動、コピー • トランザクションの表現 • 複数レコードを選択して更新する UI • 207 Multi-Status の誘惑
  • 25. 議論になるポイント • URL に機械採番の id が含まれる • セキュアじゃ無い • 永続的でない(かも) • API のバージョニング • 自前でやっていた • https://github.com/bploetz/versionist 良さそう • rails4 の PATCH メソッドどうよ?
  • 26. 議論になるポイント • あまり非同期処理に頼らない • DOM Scripting の原則に従う • RESTful なサーバとリッチ js という設計に 倒しすぎると UX や保守性が低下する可能 性があるので注意 • REST 厨がみんな通る道 • 一方 Twitter はリッチ js から戻した • 制約をバランスすることこそが設計
  • 29. ご清聴ありがとうございました http://lumberjaph.net/graph/2010/03/25/github-explorer.html