2012-01-11 21 views
6

2つのトップレベルリソースFooBarがあるとします。今度はFooBarの一部にリンクする必要があります。 Javaクラスでは、これは次のようになります。REST APIの設計:リンクするリソース

public class Foo { 

    Set<Bar> bars; 
} 

public class Bar { … } 

私はこのような何かにFooのXML表現を形作るしたいと思います:

GET /foos/1 

<foo> 
    … 
    <atom:link rel="self" href="/foos/1" /> 
    <atom:link rel="bars" href="/foos/1/bars" /> 
</foo> 

は、だから私はかなり割り当てられているすべてのBarを公開ネストされたリソースとしてFooつまり、Barリソースには個別のライフサイクル(構成の代わりに集約)があります。

GET /foos/1/bars 

<bars> 
    <atom:link rel="bar" href="/foos/1/bars/1" /> 
    <atom:link rel="bar" href="/foos/1/bars/2" /> 
</bars> 

Alteratively私は<foo>要素先行でコレクションをインライン化できます。ネストされたリソースは、このようなリンクされているすべてのBar何かを公開する可能性があります。しかし、私はまだいくつかの疑問に悩まされています。これは要求をトリガすることによってFooからBarをうまく取り除くことができます。 /foos/1/bars/1ですが、FooにはどのようにしてBarが割り当てられますか?クライアントと仮定すると取得/barsにアクセスします。

GET /bars 

<bars> 
    <bar> 
    … 
    <atom:link rel="self" href="/bars/4711" /> 
    </bar> 
</bars> 

、それは/foo/1/bars/bars/1を割り当てることを望んで決定します。私はPOSTの要求を/foo/1/barsに考えていましたが、実際に何を提出するかは不明でした。 A link要素がBarリソースを指していますか?

POST /foos/1/bars 

<atom:link href="/bars/4711" /> 

クライアントはまだURLを作成する必要はなく、依然としてREST制約を満たしているため、これは大丈夫です。しかし、それはサーバーへのPOSTへのリンクにちょっと変わっているように感じます。このシナリオにはよりよい解決策がありますか?

+1

私は2つのリソース間の関係を確立するためのリンクを投稿することに躊躇しません。リソースを取得してPOSTすると自己記述的であると信じている人もいますが、それが必要であると私は確信していません。 –

+0

それは私があなたがa)不必要なチャットを作り、b)実際にリンクを作成するために、サーバー側のrepesentation全体を実際に必要としないためです。 –

答えて

4

私は、GET要求に応答して(言い換えれば)流れるXML表現ではなく、サーバが理解できるリソースの点でこれについて考えています。 JSONまたはXML、あるいは潜在的に他の表現を返すRESTfulなサービスがあります。

だから私はバーの完全なリストまたはいくつかのバーの追加のいずれかを指定する

/foos/{fooId}/bars 

にあなたの投稿やPUTingに同意します。

投稿されたペイロードの形式は、使用しているメディアタイプの自然なシリアル化された形式であれば何でもかまいません。私の場合、それはしばしばJSON文字列であるため、私のサービス実装では、逆参照された参照URL文字列が並直列変換されて表示されます。

あなた

<atom:link href="/bars/4711" /> 

の場合も、直列化された形式は少し、ええと、装飾用であるならば、私は問題を見ないきれいdeserialise。

要約:あなたの(de)シリアライザーにとって自然なことをしてください。

+0

実際、私は実際の表現がここで重要だとは思わない。 JSONを使用していた場合も同じ問題が発生します。ここでは例としてXMLを選択しました。標準の 'link'要素があるため、私はJSONで自分自身で何かを考え出す必要があります。それでもあなたの答えをありがとう! –

+0

あなたのケースの表現にはatom:linkという言葉があり、それがあなたの懸念の原因だと思っていました。 "/ bars/4711"のような一意のIDは、私にとってかなり議論の余地がないようです - あなたはIDを持っていなければいけませんか? – djna

+0

これはおそらく私にとって奇妙な気がするのは、クライアントがリソースをナビゲートできるようにするために、サーバーからクライアントへのリンクをこれまでにしか送信していないからです。リンクをポストする必要はありませんでした。クライアントがURLを思いついてRESTの原則を破らなければならないという気持ちにトラップされました。しかし実際には、それは前部を発見するので、私はうまくいくはずです。 –

関連する問題