の配列フィールド内の項目を削除しますここで、リソースを更新し、の成分にフィールドの成分を追加または削除したいとしましょう。 一方の方法は、GET
のリソースに、配列を操作し、PUT
またはPATCH
を返します。しかし、これはかなり混乱したプロトコルであり、配列が大きすぎるとスケーラビリティの問題も発生します。REST APIのデザインは、我々は以下のRESTリソースコレクションのエンドポイントを持っていると仮定しましょう/追加リソース
ソース配列を持たずにこの追加/削除操作を行う最良の方法は何ですか?
私はすでに以下を調査しました:JSON Patch Specification しかし、仕様はRESTではないようです。それは、表現のような異なる「操作」を持つ同じリソースを使用します。これは、リソースの表現とはまったく異なります。
GET
に表示されているように、PUT
/PATCH
メソッドのリソース表現を可能な限り保持したいと思います。
ここに私の考えがあります。
オブジェクトへ- 変更文字列タイプ項目
- オブジェクトにメタフィールドを追加しますので、この設計では、ここでのリソースがどのように見えるかです
$オペアンプと呼ばれます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"
}
]
}
誰もがより良い方法を持っていますか?このテーマにはいくつかの基準がありますか?
しかし私は、私の要件は、製品の大部分にもこれをサポートすることです、HATEOASを考えました。特定のIDのない/ productsコレクションのPUT/PATCHを意味します。除去については、「完全消滅」シナリオがあり、すべての製品に特定の成分を除去するように指示したいと考えています。 – Genry
という意味で、成分が完全に溶けたときに同じ問題がリンク配列で発生します。 – Genry
POST/products/ingredientsとDELETE/products/ingredientsのサポートを提供していますか?name = IngredientNameはこの問題を解決しますが、この適切な解決策があるかどうかはわかりません。私は好奇心が強い、このケースをRESTコンベンションで100%正確に設計する方法。 –