Doorkeeper
http://rubychildren.doorkeeper.jp/events/20247
Togetter
http://togetter.com/li/781514
以下の書籍をターゲットとした勉強会なのです。
![]() | Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus) (2010/04/08) 山本 陽平 商品詳細を見る |
場所は高円寺の株式会社ヴァル研究所さんです。
参加者は25人くらいかな?
私は第2回から、3回連続の参加です。前2回のブログはこちら。
この日はお仕事の都合で、30分ほど遅れての参加です。
今回は「7章 HTTPメソッド」がターゲットでした。
開始に先立ち、今回の第7章で注目して読んでほしいポイントが@tkawa さんから示されました。
今回の第7章で注目して読んでほしいポイントです。最後の時間で解説します #RESTudy https://t.co/2ZH2dKmNuR
— Toru KAWAMURA (@tkawa) 2015, 2月 10
勉強会終了後、ポイントに対し解説が追記されました。
以下、テーブルでのディスカッションや質疑応答での個人メモ。
■ PUTでリソースの上書きを避けるためにクライアントで事前にURIの存在をチェックする (P.95)
- どうすればチェックできるか?
- クライアントからHEADメソッドでURIの存在をチェックし、リソースが存在しないことを確認してからPUTを投げるとしても、その短い隙に他の誰かがPUTでリソースを作成してしまう可能性は避けられないのでは?
- DBの世界ならトランザクション制御で回避できそうだけど、Webの世界ではどうするの?
- 楽観排他を使えばいけそうな気がするが、でもトランザクションにより直前検索と更新を1トランザクションに含めないとダメな気がする・・・
- @tkawa さんによると、「16章」のP.290あたりにやり方が書いてあるそうな。
- https://gist.github.com/tkawa/362968bf635325cb39bb
- HTTPで楽観的ロックを実現するには「条件付きPUT」と「条件付きDELETE」を利用すれば良いらしい。
- リソースが存在しない場合のみ操作する、という条件を付ければ良いとのこと。
■ PATCHメソッド
- 表7.1にHTTPメソッドが8つ紹介されているが、PATCHメソッドがない・・・
- PATCHメソッドはHTTP仕様に載っているわけではなく、他の標準になっている。
- PATCHメソッドで「差」の表現をリクエストで送ると、それに応じて部分的に変更してくれる。
- JSON PATCHというのを使えば差分表現ができる。
- PATCHメソッドはリソースの部分的な変更を行うのに対し、PUTはリソースをすべて置き換える。
- PUTは効率が悪いので部分更新がしたい、という場合にPATCHを使えば良い。
■ POSTによるリソースの追加
- 7.4節は「POSTでリソース追加」、7.5節は「PUTでリソース更新」となっているが、POSTは追加じゃなくて更新なのでは?
- ⇒ 「更新」と考えて良い。ただし、PUTは全体を丸ごと更新するのに対し、POSTは部分更新となる。
- POSTの部分更新は、PATCHでも良い。
■ 「HTMLのフォームで指定できるメソッドがGETとPOSTだけ」なのは何故か?
- 全テーブルでその議論がされていたようだが、jxckさんがブログに詳しく書いているのでオススメ。
- なぜ html の form は PUT / DELETE をサポートしないのか?
■ 「7.12節 メソッドの誤用」の例
- OPTIONSメソッドでyahoo.comにリクエストを投げると、普通にトップページ返ってくる・・・
- OPTIONSメソッドでgoogleにリクエストを投げると、ちゃんと「405 Method Not Allowed」が返ってくる。
- でも、「501 Not Implement」でサーバーのエラーとした方が「ごめん、実装してない」と伝わって紳士的かも。
- OPTIONSメソッドでヴァル研究所のサイトにリクエストを投げると、サポートされているメソッド一覧が返ってくる。
- でも、書籍に「OPTIONS自体はAllowヘッダに含めない」と書いてあるのに、なぜか含まれている・・・
- Yahoo!は、OPTIONSをプロキシで通してない可能性ある。
- OPTIONSに対してトップページを返す挙動はメソッドの誤用なので、本来は返すべきではない。
- どうやってOPTIONメソッドのリクエストを飛ばしたのか?何かツールを使ったのか?
- HTTPieというツールを使った。
■HTTPie
- HTTPieコマンドを使うと簡単にリクエストを送ることができるのでオススメ。
- 使い方は簡単だし、色が付いて見やすい。
- 昔はtelnetでリクエスト送ってたこともあるが、けっこう大変だった・・・
- でもhttpはテキストのやりとりなので、ちゃんと書けばtelnetでもリクエストを送れる。
■ HTTPieによるOPTIONSメソッドの実験
Windows7(x64)にHTTPieをインストールし、前述したYahoo!、Google、ヴァル研究所、それぞれのサイトにOPTIONSメソッドでリクエストを送ってみる。
(1) HTTPieをWindows7(x64)にインストール
HTTPieのGitHubにある手順に沿って、pipコマンドでインストールしてみた。
ちなみに私のPCにはもともとPythonがインストールしてあったので、そのままpipが使えたのである。

すんなりインストール完了。
(2) ヴァル研究所のサイトへOPTIONSメソッドでリクエストを投げてみる

お、サポートしているメソッドがちゃんと返ってきた。
GET, HEAD, POST, OPTIONS がサポートされているようです。
書籍には「OPTIONS自体はAllowヘッダに含めない」と書いてあるのに、たしかにOPTIONSが含まれている・・・
(3) GoogleのサイトへOPTIONSメソッドでリクエストを投げてみる

勉強会で言及されていたとおり、「405 Method Not Allowed」が返ってきました。
レスポンスのボディにはHTMLが入っていますね。
(4) Yahoo!のサイトへOPTIONSメソッドでリクエストを投げてみる

ホントにTOPページのHTMLがまるごと返ってきました・・・
ちなみにレスポンスが長すぎて1ページに収まらないので、パイプで more コマンドに渡して表示してます。
OPTIONSメソッドが想定している挙動と異なりますね。これは誤用と言えるのかな?
以上、HTTPieによる実験でした。このツールはすごく便利だなぁ・・・
■ 擬似REST
- 7.9節で紹介されている「_methodパラメータ」は、Railsでは「擬似REST」と呼ばれているらしい。
- 最近のフレームワークは、擬似RESTとして主流の「_method」と「GData」の両方をサポートしていることが多いらしい。
- RailsもGDataは使えるらしい。
■ OPTIONSって何に使うの?
- CORS(Cross-Origin Resource Sharing)で使う。
- Ajaxでブラウザ内から違うドメインへAjaxリクエスト飛ばすときに、ブラウザがプリフライトリクエストとして自動的にOPTIONSを投げるとのこと。
- プリフライトリクエストは開発者が実装するんじゃなくて、ブラウザが自動的に行う。
- OPTIONSの使い道は、これくらいしかないかもしれない。
■ 次回の勉強会
- 読書だけでなく、実践の要素を入れたいとのこと。
次回は実際にサイトとかを見て「ここはこれがちょっと...。ここはこうカイゼンできる!」という流れでやりたいのでいいサイトを探してます。 #RESTudy
— ぷぽ (@pupupopo88) 2015, 2月 10
★感想:
本に書いてあること以外のノウハウをたくさん学べてとても有意義でした。
HTTPieはとても便利ですねー
今、以下の書籍のコードを写経して動作確認したりしてるんだけど、それにも使えそう。
![]() | JavaによるRESTfulシステム構築 (2010/08/23) Bill Burke 商品詳細を見る |
各サイトのOPTIONSメソッドの挙動が異なる点も面白いですね。
やっぱ手を動かして、自分の目で確認するのは楽しいです。
帰りの電車で、Jxckさんのブログ「なぜ html の form は PUT / DELETE をサポートしないのか?」もじっくり読みました。
とても参考になるまとめですねー
参加者の皆様、ありがとーございました。
- 関連記事
-
- 「外部キー Night」に参加しました
- 「RESTful#とは勉強会4」に参加しました
- 「Yokohama.groovy #29」に参加しました