2017-05-06 6 views
0

対Iは、Web APIアプリケーションに取り組んでいると私は現在、RESTfulなAPIの設計の私の理解に苦しんでいます。REST - クエリ文字列はURLパス

投稿リソース/api/postsがあり、クライアントが今月のすべての投稿をリクエストできるようにしたいとします。 私の理解から、これを達成する2つの方法があります。

一つの方法は、リソースとして現在の月にすることができます。 もう1つの方法は、Postリソースのクエリ文字列です。

これを行うための最善の(RESTfulな)方法は何ですか?

api/posts/currentmonth

または

api/posts?stardate=???&enddate=???

答えて

1

これを行うための最善の(RESTfulな)方法は何ですか?

RESTはURIデザインには関心がありません。

URIの設計ガイドラインは、人間のために物事を簡単にするために、主つもり。スペルを簡単にすることができ、ルーティングの実装を簡単にすることができます。

Alan Bates answeredこれは非常に徹底的にエンジニアリングしています。要約:RFC 3986は、階層がパスに属し、非階層データがクエリに属する​​ことを示します。

現在の月をリソースにすることもできます。もう1つの方法は、Postリソースのクエリ文字列です。

慎重に...

api/posts 
api/posts?stardate=???&enddate=??? 

ものは限りRESTとあなたのRESTfulなクライアントが懸念しているとして、異なるリソースです。クエリ文字列は識別子の一部です。同じことを別の方法

GET /api/posts?stardate=???&enddate=??? ... 

を言っ

は、あなたのルーティングフレームワークは、後者の一つに元を翻訳することができる

Resource(/api/posts?stardate=???&enddate=???).get() 

ない

Resource(/api/posts).get(stardate=???&enddate=???) 
Resource(/api/posts).query(stardate=???&enddate=???).get() 

を意味し、それは実装の詳細です。 RESTは、クライアントとサーバーが独立して進化できるように、これらの詳細をインターフェースから分離するように設計されています。

なぜapi/postsとapi/postsですか?stardate = ??? & enddate = ???異なるリソース?私はいつもクエリ文字列は単にリソースをクエリする方法だと思っていました。

私の理解は、多少の日付の日付です。

RFC 1630は照会可能オブジェクトのURIとの間の境界を区切るために使用されているという解釈

疑問符(「?」、アスキー3F進)と整合定義、およびセットのを含んでいますそのオブジェクトに関するクエリを表現するために使用される単語。このフォームを使用すると、結合されたURIは、クエリが元のオブジェクトに適用された結果のオブジェクトを表します。しかし、標準の言語がRFC 3986

へのパスコンポーネントは、通常、階層形式で編成されたデータ、つまり、非階層クエリのデータと一緒にが含まれている私たちが得た時間によって変更された

コンポーネントSection 3.4)は、URIのスキームおよび命名権限(存在する場合)の範囲内のリソースを識別するのに役立ちます。

重点が

に資源の重要な機能を追加し、フィールディングによって記載されているように、彼らは抽象的であるということです。

RESTは、コンポーネント間の相互作用に関係する特定のリソースを識別するためにリソース識別子を使用します。 RESTコネクターは、メンバーシップ関数の定義方法または要求を処理しているソフトウェアのタイプに関係なく、リソースの値セットにアクセスして操作するための汎用インターフェースを提供します。

つまり、クエリをオブジェクトに渡すことによって表現が生成されるか、ドキュメントストアにアクセスするときに識別子をキーとして使用して生成されるか、キャッシュ内のエントリが生成される可能性があります。クライアント(および中間コンポーネント)は、インターフェイスの背後に隠れている実装について何も知る必要はありません。彼らは関心のある概念マッピングを特定し、サーバーにそのことをさせるだけです。

+0

あなたの答えをありがとう。なぜ 'api/posts'と' api/posts?stardate = ???&enddate = ??? '異なるリソースですか?私はいつもクエリ文字列は単にリソースをクエリする方法だと思っていました。 –