2016-08-17 6 views
1

既存の製品データベースの上に(読み取り専用の)RESTサービスを配置する必要があります。簡単な部分は、トップレベルの製品のリソースを持っているようなものです:REST APIデザイン:サブリソースでもあるリソースを処理する方法

/api/products/ 

、実際にこのサービスの発信者ではなく、店舗の特定のプロセス(のような "のIDに基づいてその関連製品を取得する必要があります小売")。これらの2つの値を組み合わせることで、構成の一部を構成することができます。これは発信者にとって透過的でなければならず、これらの「製品ポートフォリオ」について知る必要はありません。

だから私は、1234 StoreIDで、小売はプロセスであり、このようにURIの設計について考えた:

/api/stores/1234/retail/products 

私がいっぱいここに製品やURIを返す必要がある場合は、ここまで来る最初の質問です.../api/products /にある個々のリソースは、呼び出し元が/ api/productsから個々の製品を取り出す必要はないということは明らかです。これは、/ api /店舗/ 1234 /小売/製品URI。

物事を複雑にするにはもちろん、それらの商品にも価格があります。また、ここでは、製品には1つの価格がありませんが、StoreIDとプロセスにも依存する複数の価格があります。実際には、価格はそう、製品の直接の子である:

/api/stores/1234/retail/products/ABCD/prices 
:StoreIDとプロセスのに関連しているよう

/api/products/ABCD/prices 

は、再び明白な選択であるが、考えのように、URIを価格プレフィルター

が適切でしょう。

同時に、製品の詳細のように、このURIの下にあることに意味のない製品の他のサブリソースがあります。これらは店舗やプロセスに依存しないため、/ api/products/ABCD/detailsの下でのみ意味があります。

しかし、これはどうにか私に乱雑に見えます。しかし同時に、唯一の製品のリソースに直接それを解決するためにqueryparamフィルタを有することによって、これを解決するには、非常に良くないと、StoreIdとプロセスの両方を提供するために、発信者を強制しません:

/api/products?store=1234&process=retail 
/api/products/ABCD/prices?store=1234&process=retail 

さらに、プロセスやstoreidは製品とは何の関係もないので、製品に直接問い合わせるのは奇妙に思えます。価格については、それは意味をなさないでしょう。

私の質問は:これは私が見ていないこれを解決する良い方法はありますか?そして:あなたがサブリソースであるときに完全な製品を返すことをお勧めします - それを行うときに(HTTP)キャッシュを扱うことについてどう思いますか?私は/ API /製品/ に彼らの個々のリソースにフル こちらの製品またはURIを返す必要がある場合はここまで来る最初の質問は

+0

'store'と' process'が 'products'リソースのパラメータである場合、サブリソースを取得してもそれを維持するのがよりクリーンだと思います。救助 - '/ api/products; store = 1234; process = retail/ABCD/prices'のためのマトリックスパラメータ。一般的に言えば、良いURIデザインでは、サービスをよりRESTfulにするのではなく、より複雑なURIを持つものを作成するわけではありません。クライアントは本当にRESTfulな環境で、サーバーの応答から必要なものをすべて学びます。ほとんどのRESTサービスは自分自身をRESTfulと呼ぶべきではなく、むしろ 'HTTPやASOTOHの上にあるAPIサービス ' –

+0

これは/ api/products URIの上に直接公開することの1つの問題は、ストアとプロセスの組み合わせが実際に特別な意味を持ち、私が選択しているデータのセットを減らします。たとえば、ストアIDだけを渡すと、すべての製品から選択されますが、両方を渡すと、構成されたサブセットからのみ選択されます。そのため、特別なシナリオをクエリするときに特別なURIを使用すると、店舗とプロセスが商品に直接関連付けられていないため、さらに意味があると考えられました。 – CodingByLuck

答えて

0

[...] CONはこの を引き起こすことになります/ api/stores/1234/retail/products URIの頭痛をキャッシングします。

私は間違いなく完全な製品を返すでしょう - 顧客が単に製品名のリストを表示したいと思うならば、クライアントがやらなければならない量を想像してください。理想的には、このエンドポイントにページ番号が付けられます(クエリ文字列には、たとえば&pageSize=10&pageNumber=2などが含まれます)。

また、Redisのようなデータ構造サービスにすべての製品をキャッシュするなど、さまざまなキャッシュソリューションがあります。

は物事を複雑にしているのは、もちろんそれらの製品も価格[...] と詳細サブリソースを持っています。 Richardson Maturity Model level 3を見ると

リンクが遊びに来て、あなたは、製品のリソースの下でこのような何かを持っている可能性があり、これは次のようになります。

<link rel = "/linkrels/products/ABCD/prices" 
     uri = "/products/ABCD/prices?store=1234&process=retail"/> 

および製品の詳細リソースの別の同様のリンク。

@Romanは正しいですが、RESTは検出可能であることを前提としています。クライアントはSOAPなどのように暗黙のうちにリンクをたどるだけでよいのです。

+0

ありがとうアレクサンドル。価格について考えてみると、商品と比較して、このストア/プロセスの必須の組み合わせではないため、/ stores/... URIの下にそれらを置かないのは間違いありません。彼らはそれについても照会することができますが、それは選択する価格のサブセットを減らすことはありませんが、これはこの組み合わせが与えられた場合の製品の場合です。これは、ストア/プロセスの組み合わせに対して構成された製品のサブセットを考慮する必要があるときには特別なURIを持つのが理にかなっていると思うのはなぜですか、私は常に、完全なデータセットから/ api/productsを選択します。 – CodingByLuck

+0

リンクに関しては、それは私がそれを行う方法です、私の応答の中のサブまたは関連するリソースへのリンクを提供します。しかし、私はHATEOASを実装するつもりはないので、どこでもRESTfulなことは言及していません:) – CodingByLuck

+1

@CodingByLuckはあなたの投稿を更新し、 'REST'キーワードをタイトルとタグから削除します。 RESTfulソリューションです。これにはHATEOASも含まれています。これは[いくつかのアーキテクチャ上の制約の1つです](https://en.wikipedia.org/wiki/Representational_state_transfer#Architectural_constraints)です。 –

関連する問題