「安全」と「べき等」の概念は理解できましたか? とくに「べき等」を噛み砕いて言うと? 本文の例のほかに「べき等」な例を挙げてみましょう。
よく使うRubyのメソッド(他の言語でもOK)がべき等かどうか考えてみましょう。
べき等だと何がメリットなのでしょうか?
前回の質問「OPTIONSメソッドの用途は?」への回答です。
OPTIONSメソッドは、ブラウザから別ドメインへのアクセスを行うための仕様であるCORS(Cross-Origin Request Sharing)で使われます。
web サーバーがサイトを跨ぐアクセスを制御する方法を規定することで、サイト間での安全な通信を保証するというものです。特筆すべき点として、この仕様は XMLHttpRequest のような API コンテナ内で緩和策として使用されることにより、現行のブラウザにおいて同一ドメイン制限を超えることを可能にするということです。
https://developer.mozilla.org/ja/docs/HTTP_access_control
ブラウザからJavaScriptで他のサーバにアクセスしようとしたとき、昔は同じドメインにしかアクセスできませんでした。(「クロスドメイン通信の制限」p.237を参照) CORSを使うと、 サーバが許可した場合 ブラウザは別ドメインのサーバへJavaScriptでアクセスすることができます。デフォルトでは不許可です。
サーバがブラウザへ許可を伝える方法はレスポンスヘッダですが、POSTのような安全でないメソッドの場合、レスポンスで許可/不許可を確認する前に、すでに安全でない操作が完了してしまいます。これではデフォルトで不許可になりません。
そこで、先にサーバの許可/不許可を確認するため、ブラウザは自動的にOPTIONSリクエストを送ります。これをプリフライト(preflight: 飛行前の)リクエストといいます。
この用途ではサーバはAllow
ヘッダではなくAccess-Control-Allow-Origin
,Access-Control-Allow-Methods
ヘッダなどを返します。
OPTIONS /resources/post-here/ HTTP/1.1
Host: other.example.jp
Origin: http://me.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Access-Control-Allow-Origin: http://me.example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
Access-Control-Max-Age: 1728000
...
許可されたので、この後ブラウザはPOSTリクエストを送ります。
Amazon S3にブラウザからJavaScriptで直接アップロードすることができます。
メソッド | 安全 | べき等 |
---|---|---|
GET/HEAD | ○ | ○ |
PUT | × | ○ |
DELETE | × | ○ |
POST | × | × |
PATCH | × | × |
安全とは「操作対象のリソースの状態を変化させないこと」を意味します。
安全とは、操作対象のリソースに対してであることに注意してください。
べき等とは「ある操作を何回行っても結果が同じこと」を意味する数学用語です。
べき等とは「レスポンスが変わらない」ではないことも注意しましょう。 例:DELETEを2回行った場合
テレビのチャンネルボタン(音量+/-ボタンはべき等ではない) エレベータのボタン
変数への代入 n = 1
array[1] = 'REST'
(array << 'REST'
はべき等ではない)
Rubyの require メソッド require 'rails_helper'
(load メソッドはべき等ではない)
p.103
リクエストが成功した場合、 要素の内容が「test1」から「test2」に更新されます。しかし通信エラーが起こり、クライアントがレスポンス(200 OK)を確認できなかったらどうなるでしょうか。そのときは、再び同じリクエストを送信できます。
p.104
このように PUT と DELETE には、同じリクエストを複数回送信しても結果が変わらない性質(べき等性)があります。この性質により、クライアントは送信の重複を恐れることなく、PUT と DELETE を何回でも送信できます。
http://ja.wikipedia.org/wiki/%E5%86%AA%E7%AD%89
赤外線による遠隔操作やタッチパネルなどのユーザインタフェースでは、ユーザーがちゃんと一回だけボタンを押せるかどうかが確実とは言えないので、冪等なユーザインタフェースが好ましい。エレベータを呼ぶボタンも冪等である(エレベータが到着するまで何度押しても効果は変わらない)が、人によってはそうでないかのように(エレベータが早く到着することを期待して)何度も押してしまう。…オンラインでのショッピングやインターネットバンキングでは、間違って複数回注文してしまうことがないよう注意が必要である。
Twitterへ #RESTudy をつけてどうぞ。
https://twitter.com/hashtag/RESTudy?src=hash
題材:GitHub Gist https://gist.github.com/
- どういう画面があるでしょうか? それによってリソースを見つけることができます。
画面=URL(をGETしたもの)=リソース - そのURLはどんな名前でどういう形をしているでしょうか?
- それぞれの画面にはどんなリンクやフォームがあるでしょうか? フォームのメソッドは?
- ここはRESTfulだ、ここはRESTfulじゃない、と思うところはどこでしょうか? どうすればよりRESTfulにできるでしょうか?