2011-12-28 9 views
0

私はリソースを持っていますが、これは基本的にシンプルなCRUDドキュメントであり、自己の現在の代わりに「同期」状態に「切り替える」ことができます値は現在、それが現在同期されている "親"ドキュメントの値を返します。バイナリ状態のリソースのRESTfulなデザイン

私はこれをモデリングするためのRESTfulな方法を見つけようとしています。リソースには、この状態を示すプロパティーがあります。Synchronzied = true/falseおよびParentIdプロパティーは、同期するリソースを示します。

PUTの更新中にこれを変更できるようにすることもできますが、これはドキュメントの一部ではなくドキュメントに関するメタデータであるため、何らかの誤りがあります。私はまた、要求された状態が引数として渡されるところのPOST /document/{id}/synchronized要求を考慮しました。

どちらもどちらも気分が良くありません。私はちょうど1つの値のために提出されたデータを解析しているように感じるので、最初は少しぎこちなく感じます、残りは本質的に私たちが同期している場合は破棄されます。 2番目のケースでは、1つのプロパティに対してネストされたリソースを作成するのは間違っています。

+0

私が正しく理解していれば、それは同じリソースではなくなっているという点で、状態を「切り替える」ことはRESTと一致していないようです。しかし、リソースが新しいリソースに変換されず、両方のフォーマットにアクセスできるようにするには、単純にリソースを別の方法で表現していて、新しいものを作成しないので、コンテンツタイプのネゴシエーションに行きます。 – Brenden

答えて

1

ここでの解決策は、完全なドキュメントとスレーブドキュメントの2種類のリソースタイプをMIMEタイプで区別することです。たとえば、フルドキュメントの場合はapplication/vnd.mysite.document、別のドキュメントにリンクしている場合はapplication/vnd.mysite.documentlink+jsonとなります。完全な文書にするために

PUT /document/1234 
Content-Type: application/vnd.mysite.documentlink+json 

{"parent": "/document/1"} 

:スレーブ文書を作るために

次にあなたが文書または303を返すことによってGET要求に応答することができます

PUT /document/1234 
Content-Type: application/vnd.mysite.document 

Hello, I am a document full of stuff. 

を(他を参照してください)にリダイレクト親。

+0

はい、私はすぐに行くと思っている方向に非常に似ています。しかし、かなりリファクタリングが必要ですが、これは理想的なアプローチだと思います。私はカスタムのMIMEタイプを避け、今のところプレーンなJSONに固執すると思います。 –

0

ほとんどの共通オプションを検討しましたが、HTTPPATCH methodを使用することを検討してください。 FirefoxとChromeの両方でAJAX経由で正常に使用しました。 PATCHメソッドは、ドキュメント全体を置換するのではなく、ドキュメントに適用する変更を指定します(PUT経由)。

(あなただけ 文書の一部を取得する場合、 Range header GETとを指定することを検討してあなたは、XMLやJSON文書を扱うためにバイト範囲以外のものを定義する必要があります - 。 range unitsの詳細を参照してください。 )

明らかに、これらのソリューションのどちらも、意図的なクライアントとサーバーを想定しています。要求の両端でAPIをサポートできない場合は、いずれも成功しません。

+0

私はPATCHメソッドを避けたいと思います。これはとにかくパッチのような気がしません。 –

1

同期リソースのGETに応答して、Locationヘッダーを親リソースに設定して302/303を返すと考えることがあります。しかし、同じ同期化されたURI上のPUTが転送されたエンティティにリダイレクトを置き換えることを許可します。その後、それはその後のGET応答で返されます。クライアントがエンティティを同期状態に戻すことを許可したい場合は、目的の親のURIを含む要求本体を子URIにポストすることで可能です。あなたは、既知の親の小さなセットのIDだけでなく、クライアントがURIをPOSTすることを許可することによって、偶然に起こるユースケースを見つけることさえできます。

GET /child 
    200 OK 
    {foo: bar} 

POST /child 
{parent: /some/other} 
    200 OK 

GET /child 
    302/303 
    Location: /some/other 

PUT /child 
{foo: baz} 
    201 Created 

GET /child 
    200 OK 
    {foo: baz} 
関連する問題