2009-07-25 6 views
4

私は、人々が昼食のために行くべきレストランのようなグループ活動を決めるのに役立つ小さなツールを構築しています。私のオブジェクトはイベント、オプション、環境設定です。イベントにはいくつかのオプションがあり、ユーザはそのオプションを発明順に順位付けすることができます。したがって、ユーザーの投票は1:オプションB、2:オプションA、3:オプションCになる可能性があります。このマップはどのようにRESTfulインターフェイスにマップされますか?

これをRESTにマップする最良の方法は何ですか。私は混乱どこのオプションでのユーザー投票を行う方法です

(すべての場合には、認証されたユーザーが存在しなければならない)私は

GET /events/ : list of events 
POST /events/ : create a new event 
GET /events/1 : get event one 
and on options with: 
POST /events/1/options : add a new option to the event 

で、イベントにCRUDをサポートしなければならないことは明らかと思われますイベント。 RESTに最も適していると思われるのは、/ events/1/options/1/voteへの各オプションのPUTを行うことですが、これは投票間で要件を強制するのが難しいようです1 B、2 A、3 Cのように一度にすべての投票を得た場合、私はこれを行うことができますが、ユーザーが1 C、2 B、3 A、アプリケーションはそれらの要求の間に無効な状態になります。

投票を1つのパッケージにして、/ events/1/votesにアクセスする必要がありますか?

(これは週末のプロジェクトの計画を過剰に見えるかもしれませんが、私は私が書くために支払わよコードでその豪華さを持っていないので、私の目的は、右のそれを行うことです。)

答えて

4

票は、ユーザー、投票、およびオプションを関連付けるレコードですので、私はは、これらの投票記録のためアクションを作成し、本質的として、/votesからPOSTとして投票を設計します。あなたがユーザーに記入し、あなたの整合性チェックの後に適切なステータスコードを返すサーバーで

POST /votes 
[ 
    { option: 38, vote: 2 }, 
    { option: 39, vote: 1 }, 
    { option: 40, vote: 0 } 
]

:次に、あなたは明らかに(JSONで)次の例のようになります要求に、いくつかの投票を組み合わせることができます。

0

Iこのようにそれを行うだろう:

/events/1/options/vote/1stchoice 
/events/1/options/vote/2ndchoice 
/events/1/options/vote/3rdchoice 
/events/1/options/vote/4thchoice 
… 

そのように、ユーザーが自分の2番目の選択肢などとしての彼の最初の選択肢、Bなどに投票したい場合、彼は/ /イベント/ 1に「A」を置きますオプション/投票/第1選択、/イベント/ 1 /オプション/投票/第2選択などの場合に使用されます。

ユーザが選択肢を変更したい場合ay、Bを最初に、Aを2番目にする)、彼は投票を削除してから再作成する必要があります。

ユーザーが1つのオプションのみを選択できる投票では、options/vote/1stchoiceのみ有効になります。

+0

これらのURIは重要ではありません。これらのURIは、いくつかのエントリーポイントをフィールドとして使用して、クライアントがそれらを構築したり、その内容について何も知る必要はありません。 – aehlke

1

私はあなたがする必要があることは、あなたがあなたのインターフェイスで表現しているものが何であるかを調べることだと思います。これは、休憩インターフェースを設計する本当の第一の原則です。

イベントがオプションのセットを所有し、操作が「投票を追加」であるか、またはモデルが/人/嗜好/オプションである/イベント/オプションであるかどうかは明確ではありませんオプションと操作は同じです '追加投票'。

どちらの場合でも、以前に提案されたアイデアは、一組のオプションをすべて一度にPOSTすることは適切な方法であり、/ person/preferencesまたは/ eventは両方とも独自のコレクションであり、 POSTが適切です。

あなたが個々のオプションに投票した場合、どちらの場合でも特定のオプションの投票数を設定します。この場合、/ event/option/1または/ person/preference/1(オプション1の場合)のPUTが適切です。

関連する問題