重要なのは、コメントが投稿リソースに「含まれている」かどうかだと思います。RESTful URLはパーマリンクである必要があるため、すべてのシナリオで、特定のコメントへのエンドポイントを変更してはならないことに注意してください。含まれているように見えるので、URLパターンでコメントを投稿内にネストできます。そうでない場合(たとえば、コメントが別の投稿に移動し、ネストするとURLが変更される可能性がある場合)、投稿リソースによって参照される/ comment / {id} urlを使用したよりフラットな構造が必要になります)。
重要なのは、RESTfulな「ハイパーメディアAPI」の場合、Webと同様に、ネストされたリソースまたは参照されたリソースに常にリンクすることです。クライアントがRESTパターンを必ずしも理解していることや、参照または含まれているリソースを保持するエンドポイントに関する特別な知識に依存しているわけではありません。
http://blog.steveklabnik.com/posts/2012-02-23-rest-is-over
「コメント」が「投稿」リソースの下のリソースである場合:
([httpVerb] / url)
投稿を取得する:
[get] /posts/{id}
body has a couple options - either it contains the full deep comments array
(depends on how much data, chat pattern)
{
id:xxx,
title:my post,
comments: [...]
}
... or it just contains the post resource with a url reference to the comments e.g.
{
id: xxx,
title: my post,
commentsUrl: /posts/xxx/comments
}
could also have an option like this (or other options to control depth):
[get] /posts/{id}?deep=true
投稿内のコメントのコレクションを取得します。
[get] /posts/{id}/comments
returns 200 and an array of comments in the response body
投稿へのコメントを作成します。
[post] /posts/{id}/comments
body contains json object to create
returns a 201 created
投稿の下のコメントを編集します。
[patch|post] /posts/{id}/comments/{id}
body contains json object with subset of fields/data to update
returns a 200
投稿を置き換える:
[put] /posts/{id}/comment/{id}
body contains json object to *replace*
returns a 200
投稿ごとに大量のコメントがある場合は、ページングパターンを検討することもできます。
{
id: xxx,
title: myPost,
pages:6,
commentsUrl:/posts/xxx/comments/page/1
}
それから:
/posts/{id}/comments/pages/{pageNo}
{
nextPage: /posts/xxx/comments/2,
pages:7,
comments:
[ { ...,...,}]
}
各ページは、次のページ、ページ数、およびそのページのコメントの配列を参照します。ページングパターンを使用した場合、配列内の各コメントには、個々のコメントへの参照URLが含まれます。
URLにアクションを入れていることに気付いた場合は、おそらく何か間違ったことをしていることになります。よく読んでください:http: //blog.steveklabnik.com/posts/2011-07-03-nobody-understands-rest-or-http