20

REST(フィールディングの論文など)の紹介記事を読んだ後、ステートレスであるという私の認識は、サーバー側にセッションオブジェクトがあってはならないということです。それでも、この例では、 Flask(およびおそらく私が知らないさまざまなテクノロジーの他のRESTフレームワーク)がサーバーに情報を格納するためのセッションオブジェクトを提供していることがわかります。

@app.route('/login', methods=['GET', 'POST'])
def login():
  if request.method == 'POST':
    session['username'] = request.form['username']
    return redirect(url_for('index'))
...

確かに、私はRESTの無国籍を誤解しています。それで、それは本当に何ですか?

4

3 に答える 3

5

RESTにステートレス制約を導入する目的には、可視性、信頼性、およびスケーラビリティーの改善が含まれます。つまり、プロキシやその他の仲介者は、自己記述的なステートレスメッセージを含む通信パターンに参加しやすくなり、サーバーの停止やフェイルオーバーによってセッション状態の同期の問題が発生することはなく、新しいサーバーを追加してクライアントの負荷を再度処理する必要がなくなります。セッション状態を同期する必要があります。

RESTは、いくつかのメカニズムを通じてステートレスを実現します。

  1. リクエスト後にサーバー側で状態を保持する必要がないメソッドと通信パターンを設計する。
  2. アプリケーションの状態を残さずにサーバー側の状態を直接サンプリングして移行する機能を公開するサービスを設計する
  3. セッション状態またはアプリケーション状態が必要な場合は常に、各要求の最後にメッセージとして状態を「延期」またはクライアントに戻すことによって

ステートレスの欠点は、その最後のポイントで明らかになります。ある種のセッション状態を要求するアプリケーションは、単一の要求の期間を超えて存続する必要があり、応答メッセージの一部としてその状態をクライアントに送り返す必要があります。次回クライアントがリクエストを発行する場合、状態は再びサービスに転送されてからクライアントに戻されます。

あなたはここからより多くの情報を得ることができますhttp://soundadvice.id.au/blog/2009/06/

于 2012-11-03T07:10:28.583 に答える
1

いいえ、よくわかります。RESTfulサービスには「セッション」があってはなりません。URIをメールで送信できることを常に確認し、ブックマークに保存して、リンクで参照してください。これが、RESTがWebにとって非常に重要である理由です。RESTfulなリソースがない=リンクがない。認証は、リソース表現にアクセスするときにのみ実行する必要があります。

セッションの代わりに使用できるのは、RESTメソッドで変更できるユーザーオブジェクト(ショッピングカートなど)です。これはセッションとは異なります。たとえば、他の人にショッピングカートの表示を許可できるサービスがある可能性があるためです。

于 2012-11-03T07:19:02.693 に答える
1

RESTアーキテクチャでは、セッション状態は完全にクライアント上に保持されます。つまり、共有コンテキストでサーバーにデータを残すことはできず、一連のリクエストで繰り返しデータ(相互作用ごとのオーバーヘッド)を送信する必要があります。アプリケーションの状態をクライアント側に保持すると、アプリケーションが複数のクライアントバージョンにわたるセマンティクスの正しい実装に依存するようになるため、一貫したアプリケーションの動作に対するサーバーの制御が低下します。ただし、この制約により、可視性、信頼性、およびスケーラビリティの特性がもたらされます。

  • 監視システムは、リクエストの完全な性質を判断するために単一のリクエストデータを超えて調べる必要がないため、可視性が向上します。
  • 部分的な障害からの回復作業が容易になるため、信頼性が向上します。
  • リクエスト間に状態を保存する必要がないため、サーバーコンポーネントがリソースをすばやく解放できるため、スケーラビリティが向上します。また、サーバーがリクエスト間でリソースの使用を管理する必要がないため、実装がさらに簡素化されます。

http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htmを参照してください

于 2017-04-09T06:03:40.427 に答える