2016-08-08 11 views
1

の配列フィールド内の項目を削除しますここで、リソースを更新し、の成分にフィールドの成分を追加または削除したいとしましょう。 一方の方法は、GETのリソースに、配列を操作し、PUTまたはPATCHを返します。しかし、これはかなり混乱したプロトコルであり、配列が大きすぎるとスケーラビリティの問題も発生します。REST APIのデザインは、我々は以下のRESTリソースコレクションのエンドポイントを持っていると仮定しましょう/追加リソース

ソース配列を持たずにこの追加/削除操作を行う最良の方法は何ですか?

私はすでに以下を調査しました:JSON Patch Specification しかし、仕様はRESTではないようです。それは、表現のような異なる「操作」を持つ同じリソースを使用します。これは、リソースの表現とはまったく異なります。

GETに表示されているように、PUT/PATCHメソッドのリソース表現を可能な限り保持したいと思います。

ここに私の考えがあります。

オブジェクトへ
  1. 変更文字列タイプ項目
  2. オブジェクトにメタフィールドを追加しますので、この設計では、ここでのリソースがどのように見えるかです

$オペアンプと呼ばれますGET

GET /products/123 
Accept: application/json 

{ 
    "id": "123", 
    "name": "Shampoo", 
    ... 
    "ingredients": [ 
     { 
      "name": "Sodium Lauryl Sulfate" 
     }, 
     { 
      "name": "Sodium Laureth Sulfate" 
     }, 
     { 
      "name": "Hydrochloric Acid" 
     }, 
     ... 
    ] 
} 

そして、私は食材配列から項目を削除したい場合は今:

PATCH /products/123 
Content-Type: application/json 
Accept: application/json 

{ 
    "ingredients": [ 
     { 
      "$op": "remove", 
      "name": "Hydrochloric Acid" 
     } 
    ] 
} 

か、それを再度追加:

PATCH /products/123 
Content-Type: application/json 
Accept: application/json 

{ 
    "ingredients": [ 
     { 
      "$op": "add", 
      "name": "Hydrochloric Acid" 
     } 
    ] 
} 

誰もがより良い方法を持っていますか?このテーマにはいくつかの基準がありますか?

答えて

0

私の意見では、最良の解決策は、製品の成分管理のために別のRESTエンドポイントを提供することです。また、HATEOASの方法でリンクを提供すると、製品リソースを取得した直後にその配列を完全に制御することができます。

はこの表現考えてみましょう:

あなたが製品に新しい成分を追加することができ、これを持って
GET /products/123 
Accept: application/json 

{ 
    "id": "123", 
    "name": "Shampoo", 
    ... 
    "ingredients": [ 
     { 
      "name": "Sodium Lauryl Sulfate" 
      "links": [ 
       { 
        "rel": "self", 
        "href": "/products/123/ingredients/1" 
       } 
      ] 
     }, 
     { 
      "name": "Sodium Laureth Sulfate", 
      "links": [ 
       { 
        "rel": "self", 
        "href": "/products/123/ingredients/2" 
       } 
      ] 
     }, 
     ... 
    ], 
    "links": [ 
     { 
      "rel": "self", 
      "href": "/products/123" 
     }, 
     { 
      "rel": "ingredients", 
      "href": "/products/123/ingredients" 
     } 
    ] 
} 

...

POST /products/123/ingredients 
Content-Type: application/json 
Accept: application/json 

{ 
    "name": "Hydrochloric Acid" 
} 

...または既存のものを削除します。

DELETE /products/123/ingredients/2 

ソース配列を持たずに操作を削除/このアドオンを達成するための最良の方法は何ですか?

製品のJSON表現から成分配列を削除し、それにリンクのみを残すと、すぐに新しい成分を追加することができます。

削除操作にはまだソース配列が必要ですが、非同期にダウンロードできます。実際には、配列を最初から削除することなく、何も削除しても意味がありません。あなたが取り除こうとしている成分が内部にあることをどのように知っていますか?

敬具

+0

しかし私は、私の要件は、製品の大部分にもこれをサポートすることです、HATEOASを考えました。特定のIDのない/ productsコレクションのPUT/PATCHを意味します。除去については、「完全消滅」シナリオがあり、すべての製品に特定の成分を除去するように指示したいと考えています。 – Genry

+0

という意味で、成分が完全に溶けたときに同じ問題がリンク配列で発生します。 – Genry

+0

POST/products/ingredientsとDELETE/products/ingredientsのサポートを提供していますか?name = IngredientNameはこの問題を解決しますが、この適切な解決策があるかどうかはわかりません。私は好奇心が強い、このケースをRESTコンベンションで100%正確に設計する方法。 –

関連する問題