Skip to content

Instantly share code, notes, and snippets.

@tkawa
Last active August 29, 2015 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkawa/52c49ce756bbf578594e to your computer and use it in GitHub Desktop.
Save tkawa/52c49ce756bbf578594e to your computer and use it in GitHub Desktop.
RESTful#とは勉強会5 ポイント

RESTful#とは勉強会5 2015.03.25

「Webを支える技術」第7章 HTTPメソッド

重要な用語

グループで考えてみよう

べき等性と安全性 (p.101)

「安全」と「べき等」の概念は理解できましたか? とくに「べき等」を噛み砕いて言うと? 本文の例のほかに「べき等」な例を挙げてみましょう。

よく使うRubyのメソッド(他の言語でもOK)がべき等かどうか考えてみましょう。

べき等だと何がメリットなのでしょうか?

解説

OPTIONS メソッド (p.97)

前回の質問「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ヘッダなどを返します。

POST http://other.example.jp/resources/post-here/ のためのプリフライトリクエストとレスポンスの例

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で直接アップロードすることができます。

べき等性と安全性 (p.101)

メソッド 安全 べき等
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

RESTfulなサイト作り ウォーミングアップ編

題材:GitHub Gist https://gist.github.com/

注目するポイント

  • どういう画面があるでしょうか? それによってリソースを見つけることができます。
    画面=URL(をGETしたもの)=リソース
  • そのURLはどんな名前でどういう形をしているでしょうか?
  • それぞれの画面にはどんなリンクやフォームがあるでしょうか? フォームのメソッドは?
  • ここはRESTfulだ、ここはRESTfulじゃない、と思うところはどこでしょうか? どうすればよりRESTfulにできるでしょうか?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment