2012-04-24 16 views
6

"Books"と "Users"があるREST APIを構築しています。彼らは1つのユニークな本しか存在できません。ユーザーは複数の本を持つことができますが、異なるユーザーは同じブック(または同じもの)を持つことができます。ユーザーは書籍に追加情報(評価など)を追加できます。RESTリソースが既存のリソースにリンクされて拡張されている場合の処理​​方法

私の質問は、ユーザーが既存のブックリソースを独自の設定で「拡張」しているときに、リソースをマッピングする適切な方法は何ですか?

例:最初のユーザーには書籍はありませんが、書籍を作成できます。ブックが存在しない場合は作成され、存在する場合はアクセスできます。彼らはそれに独自の私的な情報を追加することはできますが。

これは適切な方法ですか?ユーザーが作成した場合/書籍/ 1 {

"id":1, 
"title":"The Empire", 
"description":"Description about the book", 
"serial":1234 

}

//:ID 例:基本的な必要な情報を

//すべての書籍/書籍/に到達することができ書籍「The Empire」(シリアル:1234)は既に存在する本を拡張していますが、追加の情報を追加しているため、実際には新しいURLですが、Book IDを参照しています。

例:/ユーザー/ 421 /書籍/ 1/

{ 
"id":1, 
"title":"The Empire", 
"description":"Description about the book", 
"serial":1234, 
"rating":5.5, 
    "note":"I liked the book but it was too long." 
} 

あるいは:

{ 
"book":{ 
    id":1, 
    "title":"The Empire", 
    "description":"Description about the book", 
    "serial":1234, 
    } 
"rating":5.5, 
"note":"I liked the book but it was too long." 
} 

やユーザー/ 421 /書籍/ 1 /設定/のようにもURLのなめらか/

{ 
"rating":5.5, 
"note":"I liked the book but it was too long." 
} 
+1

@jayraynetがあなたの質問に答えましたか? –

答えて

4

「レビュー」を複数の親(書籍、ユーザー)と関連付けることを許可してから、revieの標準リソースを持つことをお勧めします次のようにW:

書評/reviews/{review-id}

0のためのブックユーザーによる /books/{book-id}/reviews

{[ 
{ 
"id":1, 
"userId":user1, 
"bookId":1, 
"rating":5.5, 
"note":"I liked the book but it was too long.", 
"url":http://server/reviews/1 
}, 
{ 
"id":2, 
"userId":user2, 
"bookId":1, 
"rating":1, 
"note":"boo, i didn't like it!", 
"url":http://server/reviews/2 
} 
]} 

レビュー/users/{user-id}/reviews

{[ 
{ 
"id":1, 
"userId":user1, 
"bookId":1, 
"rating":5.5, 
"note":"I liked the book but it was too long.", 
"url":http://server/reviews/1 
}, 
{ 
"id":2, 
"userId":user2, 
"bookId":1, 
"rating":1, 
"note":"boo, i didn't like it!", 
"url":http://server/reviews/2 
}, 
{ 
"id":5, 
"userId":user1, 
"bookId":3, 
"rating":2, 
"note":"I like to read", 
"url":http://server/reviews/5 
} 
]} 

正規リソースの/books/{book-id}

{ 
"id":1, 
"title":"The Empire", 
"description":"Description about the book", 
"serial":1234 
} 

レビュー

{[ 
{ 
"id":1, 
"userId":user1, 
"bookId":1, 
"rating":5.5, 
"note":"I liked the book but it was too long.", 
"url":http://server/reviews/1 
}, 
{ 
"id":5, 
"userId":user1, 
"bookId":3, 
"rating":2, 
"note":"I like to read", 
"url":http://server/reviews/5 
} 
]} 

新しいレビューを作成することは、ユーザー/レビュー、ブック/レビュー、レビューリソースへの投稿となります。これらのPOSTサービスのデフォルト実装のユーザーIDまたはブックIDのサーバー実装が適切です。

URLリンクの実装には、atom:linkなどのいくつかの選択肢があります。

また、書籍、ユーザー、レビューの生IDをこれらのサービスのクライアント/コンシューマに公開せず、idをURIとして公開することを検討してください。

+0

認証に関しては、**ユーザ**がこれらのいずれかに投稿することを許可しますが、許可を制限するか、または/ユーザだけに制限しますか? (主に/書籍と通信するかもしれない著者、出版社などの他の認可されたタイプがある... –

関連する問題