8

私は REST の原則を学んでいますが、複雑なリソースを操作することに疑問があります。

Foo と Bar という 2 つのリソースがあり、Foo ごとに Bar が必要だとします。API を使用する開発者に対して、 bar から foo への依存関係を明確にしたいので、次のようにします。

1) Foo インスタンスから Bar インスタンスへのリンクを使用します。

GET /foos/1
Foo: {
    'name': 'Foo instance',
    'rel_bar': '/foos/1/bar'
}


GET /foos/1/bar
Bar: {
    'name': 'Bar instance',
    'rel_foo': '/foos/1',
}

2) Foo から Bar への依存関係を示す URI テンプレートを使用します (REST では URI が不透明であるため、これは人間用です)。

/foos               --> Foo resource collection
/foos/{foo_id}      --> An instance of a Foo resource
/foos/{foo_id}/bar  --> The bar instance associated to the foo instance foo_id

繰り返しになりますが、対応する foo のない bar はありません。

ここで、Foo リソースを作成したいと思います。

POST /foos
{
   'name': 'Yet again another foo instance',
}

そして、サーバーに対応する Bar のデフォルト (または空の) リソースを作成させると、次の読み取りで次のようになります。

GET /foos/2
{
   'name': 'Yet again another foo instance',
   'rel_bar': '/foos/2/bar'
}

と...

GET /foos/2/bar
{
   'name': null,  --> Let's say that null is the default value.
   'rel_foo': '/foos/2/bar'
}

これを行うのは「RESTfully正しい」ですか?私の懸念は次のとおりです。

  1. サーバーに関連リソースを自動的に作成させるのは正しいですか? または、Bar と Foo の作成を 2 つのステップに分割する必要がありますか?
  2. 表現 ('name' 属性のみ) を POST し、別のもの ('name' と割り当てられた 'rel_foo') を GET するのは正しいです。

私の個人的な考えでは、Bar は Foo なしでは意味がないので、おそらくそうです。サーバーに作成させるべきです。

何か案が?

4

1 に答える 1

5

あなたの説明が独立したリソースである Foo と Bar であるかどうかはわかりません。あなたは言う:

Foo ごとに、Bar が必要です

「JSON」とあなたが説明するURIとともに、これをサブリソース関係と呼びます。すべてのFooには、このFooの外に存在できないバーが1つだけ存在する必要があります。

この解釈が正しければ、URI は保持しますが、表現を次のように変更します。

GET /foos/1

{
    'name': 'Foo instance',
    'Bar': {
        'name': 'Bar instance'
    }
}

rel_bar必要のないとを含めていないことに注意してくださいrel_bar

Bar サブリソースのみを使用でき ます。GET

GET /foos/1/bar

{
    'name': 'Bar instance'
}

この表現では、親 Foo に戻るリンク要素がないことに注意してください。URI によってリソースとサブリソースの関係が明確になるため、このようなリンクは不要です。

あなたの質問 1:

サーバーに関連リソースを自動的に作成させるのは正しいですか? または、Bar と Foo の作成を 2 つのステップに分割する必要がありますか?

bar サブリソースが実際に何らかのバックエンドで作成されているかどうかは重要ではありません。重要なのは、Foo の表現のメンバーとして到達できることです。POSTFoo 表現のみを実行した後、Bar サブリソースの表現には、説明したデフォルト値が設定されます。後でオーバーライドできます。

PUT /foos/1/bar

{
    'name': 'A name for this Bar'
}

あなたの質問 2:

表現 ('name' 属性のみ) を POST し、別のもの ('name' と割り当てられた 'rel_foo') を GET するのは正しいです。

はい、そうです。クライアントは不完全な表現をすることができPOSTます。PUT重要なことは、このような不完全な表現を常に一貫した方法で処理することです。新しい Foo ごとに Bar サブリソースが作成されることは、まったく問題ないと思います。

于 2012-11-06T20:36:50.543 に答える