2011-07-12 6 views
1

私たちのシステムには、アイテムを含むアカウントがあります。アイテムは常に単一のアカウントに関連付けられますが、システム内ではグローバルに一意のIDも持ちます。時には、そのidだけが分かっているときには、アイテムを操作することが望ましい場合もあります。RESTful APIは、世界的にユニークなリソースを作成します

従属リソース(アイテム)へのアクセスを所有者(アカウント)の外部から許可するのは間違っていますか?つまり、2つのURIを同じリソースに持つのは間違っていますか?

POST /inventory/accountId 
    #Request Body contains new item 
    #Response body contains new item's id 

GET|PUT|DELETE /inventory/accountId/guid #obviously works and makes sense 

GET|PUT|DELETE /inventory/guid #does this make sense? 

おそらく、私はアイテムを作成する代わりに、項目にクエリ文字列パラメータまたはフィールドとして考慮することのアカウントを使用して、私のリソースのレイアウトを再考してはならない。これは一例ですので、ここで説明するのは少し難しいのですか?言い換えれば

POST /inventory 
    # Request body contains item w/ account name set on it 

GET|POST|DELETE /inventory/uuid #makes sense 

GET|POST|DELETE /inventory/accountId/uuid #not allowed 

答えて

1
POST /inventory/accountId 
GET|PUT|DELETE /inventory/accountId/guid #obviously works and makes sense 
GET|PUT|DELETE /inventory/guid #does this make sense? 

/inventory/guidは(私が主張したいか、その逆)/inventory/accountId/guidにリダイレクトするとき、それは最も理にかなっています。複数のURIがリダイレクトされている単一の標準エンティティを持つことで、キャッシングスキームを最も簡単にすることができます。もし2つのURIが代わりに同じデータを返すならば、ユーザは必然的に新しい表現を1つに置き換え、キャッシュが前者のものに対してのみ無効にされたので、他のURIから古いコピーを取得すると混乱することになります。同様の問題は、2つの後続のGETにも発生する可能性があります。リダイレクトでは、よりクリーンな(完全には同期していませんが、よりクリーンな)状態に保ちます。

アイテムをアカウントに従属させるかどうかは、アイテムがアカウントなしで存在できるかどうかによって異なります。アイテムのデータがアカウントのデータのサブセットである場合は、それを下位にします。アカウントが1種類のコンテナであるか、コンテナなしで存在するアイテムがある場合は、トップレベルに昇格させてください。

+0

複数のURIをサポートするには、リダイレクトが最も効果的だと思います。それについてもう少し考えた後、私はこれを避けようとします。アカウントの下にアイテムを作成するために、場所のヘッダーを使用してリソースが作成されたURIを示すことができ、私の懸念をほとんど取り除くことができなかったことを忘れていました。 –

1

、それは同じリソースに2 URIのを持つことが間違っていますか?

いいえ同じリソースを識別する複数のURIを持つことは間違いではありません。あなたの最初のアプローチにも何か間違ったことはありません。 URIは一意の識別子であり、クライアントには不透明であることを覚えておいてください。それらがリソースを一意に識別している場合、URLをきれいに見せることについてあまり心配する必要はありません。私はリソースのモデリングが重要ではないと言っているわけではありませんが、IMOではあまり時間を費やすべきではありません。あなたのビジネスがインベントリの下で、また個々のアカウントの下で直接指示されている必要がある場合は、そうしてください。

+1

W3Cタグでは、1つのURLのみがリソース。そのリソースを参照する他のURLはリダイレクトする必要があります。 http://www.w3.org/2001/tag/issues.html#httpRange-14 –

1

許可されていないユーザーがデータを使用できるようにする上でセキュリティ上の潜在的可能性があるため、これについて心配していますか?または、あなたの懸念は純粋にデザイン駆動ですか?

セキュリティが懸念されない場合は、2つのURISが同じリソースを指していることは間違いありません。

2

同じアイテムを指している2つのURIが問題を抱えていると思います。私の経験上、これらの種類のものはスケールアウト(キャッシュ、クラスタ内の複数のノードが同期外れなど)するにつれて狂気につながります。アイテムのIDが実際にグローバルにユニークである限り、単にそれを/inventory/uidとして参照する理由はありません。

関連する問題