2012-02-10 5 views
9

安全操作、冪等性などのRESTの概念に従うために、複数のパラメータを含む複雑な検索操作をどのように実装できますか?REST検索インターフェイスとGETの等価性

私はGoogleの実装を見てきました。それは創造的です。それ以外のオプションは何ですか?

「Smith」という名前の顧客を検索すると、毎回同じセットが返されるとは限らないため、同じ条件で同じ結果が返されることはありません"顧客は常に追加されます。私の本能はこれにGETを使用することですが、真の検索機能の場合、結果は冪等ではないように見え、流体結果セットのためにキャッシュ不可とマークする必要があります。

+0

タイトルのニース編集! –

答えて

23

偶数性の背後にある基本的なことは、GET操作が操作の結果に影響しないということです。つまり、悪影響を及ぼすことなくGETを安全に繰り返すことができます。

ただし、冪等の要求はリソースの表現とは関係ありません。

二つの不自然な例:

GET /current-time 

GET /current-weather/90210 

明らかであるように、これらのリソースは、時間の経過とともに変化する、いくつかのリソースは、より迅速に他よりも変化します。しかし、GET操作自体は、実際のリソースに影響を与えることに密接に関連していません。

コントラスト:

GET /next-counter 

これは私がべき等の要求、ないと思い、明らかに、です。要求自体がリソースを変更しています。

また、偶数演算には副作用がないということは何もありません。明らかに、GETを含む多くのシステムログへのアクセスと要求。したがって、GET/resourceを実行すると、そのGETの結果としてログが変更されます。そのような副作用は、GETを冪等ではない。基本的な前提は、リソース自体への影響です。

しかし、何について、言う:

GET /logs 

ログはすべてのリクエストを登録し、GETは彼らの現在の状態でログを返却された場合、それはこのケースでGETが冪等されていないことを意味するのでしょうか?うん!それは本当に重要ですか?いいえ。この1つのエッジの場合ではありません。ゲームの性質。

何について:

GET /random-number 

あなたは、擬似乱数生成器を使用している場合は、自分の際にこれらの飼料のほとんど。種子から始めて、次の数字を得るために結果を自分に戻します。だから、ここでGETを使うことは、冪等ではないかもしれません。しかしそれは?どのように乱数が生成されるのかあなたはどのように知っていますか?それは白色雑音源である可能性があります。そしてなぜあなたは気にしますか?リソースが単なる乱数である場合、実際に操作が変更しているかどうかはわかりません。

ただし、ガイドラインの例外がある可能性があるため、必ずしもそのガイドラインの背後にある概念を無効にするわけではありません。

リソースが変化すると、それは人生の単純な事実です。リソースの表現は、普遍的なものでなくても、一貫性のある要求であっても、一貫性のあるユーザーであってもかまいません。言い換えれば、リソースの表現はGETが提供するものであり、各要求の表現を決定する基準を誰が知っているかは、アプリケーションに依存します。 Idempotentリクエストは、RESTモデルの残りの部分(キャッシングやコンテンツネゴシエーションなど)とうまく機能するため、非常に優れています。

ほとんどのリソースは素早く変更されず、非冪等動詞を使用して特定のトランザクションに依存するため、クライアントにとってより予測可能で一貫性のあるインターフェースが提供されます。メソッドが冪等でなければならない場合、クライアントは大したことではないと判明するとかなり驚くでしょう。しかし、結局のところ、アプリケーションとドキュメント化されたインターフェイスまでです。

2

同じデータセットの場合、それは等号になります。あなたはタイムスタンプフィルターでこれを達成することができます。

+0

それは大規模なログを必要とするので、私はその時点で「正しい」表現を再構築できますか? dbはPUTを介して更新され、そのGETを介して将来取得される行は、以前の形式で表現されなければなりません。偶像崇拝を果たしている間、それは私たちのために役に立たない。クエリが必要です。ほかに何ができますか?私はREST経由の検索を実装したい唯一の人にはなりません。これは私が見ることができる唯一の欠点です。エンティティが変更可能であるため、エンティティのGETさえ常に同じ表現を返すとは限りません。人々は動的エンティティの上でRESTをどのように実装しますか? –

+0

時間切れのキャッシュがないのはなぜですか? – Chriseyre2000

+0

私はその考えが大好きです。だから、要点は何ですか?私は、その表現を再提供するために、事前に決められた時間のクエリ結果を保存しますか? –

9

GETは、正しく実装されていれば安全であり、等価です。それは意味:

  1. それは同じURIで指示された場合、それは関係なく、どのように、毎回実行されるように、同じサーバー側の機能の原因となるサーバ側
  2. には、クライアントに見える副作用を引き起こさないだろう多くのそれが発行された回数、またはとき

何ではありませんがそれは同じURIにGETであるが、常に同じデータを返し上記と述べました。

GETにより、同じサーバー側機能が毎回実行され、その機能は通常、「要求されたリソースの表現を返します。」です。そのリソースが最後のGETから変更された場合、クライアントは最新のデータを取得します。サーバが実行するファンクションは、入力として使用されるデータ(要求されているリソースの状態)ではなく、冪等性のソースです。

要求されているサーバーデータが毎回同じであることを確認するためにタイムスタンプがURIで使用されている場合、これはすでに冪等元であるもの(GETを実装する関数)毎回同じ結果が保証されます。