2012-02-23 16 views
0

私はFooのためのRESTリソースを持っています。私は新しいFooを作るためにPOSTを実行できるようにしたいと思います。このREST URIを構築する適切な方法は?

FozはFizzとBuzzの2つのサブタイプしか存在しません(モデルはFooFizzとFooBuzzで、どちらもFooを拡張しています)。すべてのFoosはFizzまたはBuzzのいずれかです。他のモデルのほとんどはこのパターンにも従います(FizzとBuzzのサブタイプで一般的です)。中期的には、Foosに新しいタイプが追加されることはありません。長期的には、新しいタイプが追加される前にこのアプリケーションが廃止される可能性が高くなりますが、その可能性は存在します。

いずれにせよ、私はFoosを扱うために思いついたいくつかのURIスキームを紹介します。

  1. POST/FOO?タイプ=

  2. POST/FOO /フィズ

  3. POST /フィズ/ fooの

  4. POST/FOO-フィズ

  5. POSTフィズ/ foo/{foo-id}/fizz

私はこのことについて考えています:

(1)は、クエリ文字列が適切に形成されていることに依存しているため、不要なクライアント - サーバー結合である可能性があります。しかし、それは私にとって最も理にかなっています。

個々のFooで操作を実行するためにgo/foo/{foo-id} URIを持つことができるため、(2)および(3)は望ましくありません。

(4)Fizzesを必要とし、URIツリー

の完全に別の枝になることオースト(5)まともなスキームそれが台無しURIツリーのかもしれませんがのように思えます。

答えて

2

私は強くちょうど投稿された文書の内容によって決定されて作成されるのfooの種類と/fooにPOST(フィズや話題)を持つように誘惑されると思います。新しく作成されたfoo(おそらく/foo/{fooId})のURIへの適切なリダイレクトで応答します。これにより、通常通りに操作することができます。

+0

あなたが正しいと思います。おそらく私は情報伝達のためにURIにあまりにも頼っていたでしょう。 – smcg

+0

クエリパラメータをPOSTと混合するのは好きではありません。私がそれを見るたびに、私は誤ったデザインがあると思う。 :-) –

0

確かに、私はRESTの専門家ではありませんが、ここでは私の2セントです。

なぜあなたはfoo/{foo-id}への投稿をしていますか?その場合、更新のためのPUTのほうが多いでしょう。あなたが投稿する必要がある唯一の時間は、IDが実際に作成されるまで自動作成され、未知である場合です。ですから、その場合、fooを作成するときには1に傾き、残りはfooを作成するために必要な情報です。その後、サブタイプ(fizzまたはbuzz)について気にする必要がありますか?私はfoo/{foo-id}が個別に作業し、そのタイプを判別するのに十分な情報であると仮定します。

ので:?

  1. POST/fooのタイプ=フィズ **あなたはおそらくも、クエリ文字列を削除し、作成データとしてそれを送るが、それはあなた次第ですができ
  2. GET/foo/{foo-id} ...作成したfoo
  3. PUT/foo/{foo-id} ...作成したfooを更新する
  4. 削除する/ foo/{foo-id} ...削除する作成したfoo

これは私が少なくともやることです。

+0

サブタイプは、各サブタイプが異なるコンストラクタを持ち、作成するために異なるものを必要とするため問題となります。 (5)のようなPOSTはむしろ馬鹿だと私はあなたに同意する。そして、はい、創造的なデータを送ることが私に起こりましたが、再び、FizzesとBuzzesに必要なさまざまなパラメータのために乱雑になると思いました。 – smcg

+0

異なるタイプの作成を処理するファクトリメソッドがないのはなぜですか? –

0

<soapbox>If you are really doing a RESTful architecture, then you shouldn't need to ask this question</soapbox>

RESTfulアーキテクチャには、アプリケーションのフローを指示する表現のリンクが含まれています。親リソースの子である新しいリソースを作成する場合、親リソースの表現には、使用するURLと(使用する)動詞を示す埋込みリンクが必要です。ような何か:

<link rel="add-child" method="POST" href="http://foo/1234">Add a new child</link> 

あなたは完全に新しいルートリソースを作成している場合、あなたはおそらく、絶対URLにPOSTにしたいと回答文書またはLocationヘッダーのいずれかが、どこから新しい表現を取得するために、あなたのアプリケーションを教えています。ターゲットリソースは、基本的にアプリケーションの状態マシンへの「エントリポイント」です。

+0

親リソースが子URIを指示しているのでURIスキーマは重要ではないと言っていますか?それはまだバックエンドでうまく整理する必要があります。それが公開APIの場合はどうなりますか? – smcg

+0

公開APIは単にエントリエンドポイントです。他のすべてのURLはリソース表現(XML要素、JSONなど)に含まれているため、ジェネレータ(サーバー)のみがそれらの知識を持っています。 APIユーザー*は、最初のエントリポイント以外のURLを生成するべきではありません。 –

+0

ああ...私は、URLを生成するためにサーバー上のURLパターンを使用することに反対していません。これは、物事をスケーラブルに保つ唯一の賢明な方法です。この制約は、APIのユーザーがURLテンプレートなどを使用してURLを作成しないことです。 –

関連する問題