4

XML でシリアル化されたオブジェクトのリストを受け取り、いくつかのフィルタリング ルールを適用してそれらのオブジェクトのサブセットを返すメソッドを持つクリーンアップ/フィルタリング サービスを開発しています。

  1. REST-ful サービスでは、そのようなメソッドにはどの動詞を使用すればよいでしょうか? GET は当然の選択だと思いましたが、シリアル化された XML を要求の本文に入れる必要があります。これは機能しますが、正しくないように感じます。他の動詞は意味的に適合しないようです。

  2. その Service インターフェイスを定義する良い方法は何ですか? リソースに /Cleanup または /Filter という名前を付けるのは奇妙に思えます。これは主に、私がオンラインで見た例では、リソース名に使用されている動詞ではなく、常に名前であるためです。

  3. CRUD 操作には REST サービスの方が適していると思いますが、このサービスのような状況でルールを曲げ始めますか? はいの場合、私は間違ったアーキテクチャの選択をしていますか?

  4. シンプルにするために、このサービスを (SOAP ではなく) REST-ful スタイルで開発することを推し進めましたが、このような厄介なケースが頻繁に発生し、何かが足りないように感じます。使用すべきではない REST を選択するか、あまり重要でないことを考えすぎている可能性がありますか? その場合、本当に重要なことは何ですか?

4

2 に答える 2

5

REST は、設計された方法で HTTP を使用することです。RESTful にすることを検討してください (タイトルは REST 設計でした:):

  • URL はリソースへのパーマリンクにする必要があります (利点のキャッシュ、エンドポイントの保存/共有など...)
  • これらはリソースへのパーマリンクであるため、URL に動詞が含まれていると、パスが間違っていることを示します (フィルターは動詞です)。
  • リソースのコレクションは、エンドポイント /foos にすることができます。
  • リソースのコレクションをフィルター処理する場合は、?filter= などのクエリ文字列パラメーターや ?ids=1,2,3,4,5 などを検討してください。
  • GET はリソースを変更すべきではありません。「クリーンアップ」は何かが削除されることを意味するため、GET を実行するときはリソースの変更に注意してください。REST は、GET がリソースを変更すべきではないと述べています。クリーンアップ リクエストを GET として取得し、t がキャッシュされているため OK を返すキャッシュ サーバーを想像してみてください。キャッシュ サーバーは、POST や DELETE などをキャッシュしないことを認識しています (これが HTTP の設計方法です)。
  • 複数の呼び出しを除外しないでください。たとえば、get を実行してクリーンアップするリソースのセットを取得し、その後に多数または 1 つの DELETE 動詞呼び出しを実行してクリーンアップを実行することができます。
  • 場合によっては、クリーンアップのように機能するトランザクションや「ジョブ」などの一時的なリソースがあります。クリーンアップするアイテムを含むボディを持つリソースへの POST を除外しないでください。ジョブ ID が返されます。次に、クリーンアップの進行状況またはステータスについてジョブ ID を照会できます。

質問が明確ではないため、正確なガイダンスを提供することは困難ですが、うまくいけば、上記の RESTful 原則のガイダンスと考えが正しい方向に進むことを願っています。正確な呼び出しを明確にする場合は、API をお勧めします。

では、重複した foo をクリーンアップしたいとしましょう。

[GET] /foos/duplicates (または /foos?filter=duplicates)

重複している foo の to を識別するボディを返します。1,2,5 (名前の可能性があります) を返すとしましょう。

次に、次を発行できます。

[削除] /foos 本体は 1、2、5 (または一意の場合は名前) を含む配列です。削除呼び出しは受動的であるため、REST の原則に従って GET 呼び出しがキャッシュされていても問題ありません。

POX や JOSN RPC over http などの REST ルートに行かないことも可能で有効ですが、その時点でそれが REST ではないことに気付きます。それは問題ありませんが、フィールディングの論文で説明されている REST の利点は得られていません。

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

また、これを読んでください:

http://blog.steveklabnik.com/posts/2011-07-03-nobody-understands-rest-or-http

編集:

サーバーに一連のオブジェクト (永続化されたサーバー側ではない) を送信していることを明確にしたコメントを読んだ後、(サーバー側のヘルパー関数のように) 重複が除外されたサブセットを返します。いくつかのオプションは次のとおりです。

  1. 可能であれば、クライアント/ブラウザ側でこれを行います-ネットワークの往復を使用して、重複をコレクションから除外するのはなぜですか?
  2. 何らかの理由で、2 つのアイテムが機能的に同等であることを判断するための特定の知識/データをサーバーだけが持っている場合 (データがまったく同じでなくても)、一意の/フィルター処理されたセットを含む応答本文を使用して、データ セットをサーバーに POST することを検討してください。サーバーがセットを永続化していなくても、「一時的な」オブジェクトまたはセットに分類され、サーバーがそれを変更しています。これは概念的にはサーバー リソースの GET ではなく、キャッシュはそのシナリオでは何のメリットもありません。
于 2012-11-03T22:42:06.003 に答える
1

最初の最後の質問: 本当に重要なのは、仕事をやり遂げることです。

  • 正しい
  • 実用的で使いやすい
  • 将来のプログラマーが簡単に保守できる (自分自身を含む可能性が高い)

REST は、各 URL が操作可能なオブジェクトと一致するリソースに対する操作に自然に適合します。他の用途にはあまり適していませんが、これらは実際の規則というよりもガイドラインですREST に関する元の論文を指摘する人もいますが、純粋な実装はほとんどないことを覚えておく価値があります。

これらの変換的な種類の機能を実行する複数の URL がある場合は、それらを独自の特別な URL スペース (/api/filter/api/transliterateなど) に配置することを検討してください。これにより、ユーザーとメンテナーは、特定の URL が REST ではなく、よりリモートに似ていることを認識することができます。手続き呼び出し。これらの URL にデータを送信すると、何らかのデータが返されます。

特定の名前に行き詰まった場合は、候補のリストを作成し、ビールをいくつか飲んでから、リストから 1 つを選択します。些細なことに行き詰まったとき、私はそうします。

SOAP はきちんとしたプロトコルであり、用途がありますが、非常に重い傾向があります。優れたドキュメントと一貫性は、特定のテクノロジを使用することよりも、新進の API にとっておそらく重要です。

于 2012-11-03T21:26:44.820 に答える