REST API を設計しており、オブジェクト グラフを更新するための推奨されるベスト プラクティスを探しています。私の質問は例で最もよく説明されているので、次のようなGETリソースがあるとしましょう:
URI: /people/123
この URI は、次のようなオブジェクト グラフを返します。
{
"name":"Johnny",
"country":{"id":100,"name":"Canada"},
"likes":[
{"id":5,"name":"Fruit"},
{"id":100,"name":"Sports"}
]
}
API コンシューマがこのリソースを更新できるようにする場合、PUT または PATCH を介してオブジェクトがどのように更新されることを期待しますか? 「name」プロパティの更新は非常に簡単ですが、消費者は他のオブジェクトとの関係のみを変更でき、新しいオブジェクトを作成できないため、「country」または「likes」については確信が持てません。
更新をリクエストする方法の 1 つを次に示します。
{
"name":"Bob",
"countryId":200
"likeIds":[3,10,22]
}
この更新により、リソースが次のように変更されます。
{
"name":"Bob",
"country":{"id":200,"name":"United States of America"},
"likes":[
{"id":3,"name":"Cars"},
{"id":10,"name":"Planes"},
{"id":22,"name":"Real Estate"}
]
}
この設計では、消費者に「人」の「ID」のみを更新するように明示的かつ明確に求めていますが、PUT/PATCH のオブジェクト グラフが GET とは異なって見えるため、API の学習と覚えが難しくなっていることが懸念されます。したがって、別のオプションは、次のように PUT/PATCH を要求することです。
{
"name":"Bob",
"country":{"id":100},
"likes":[
{"id":3},
{"id":10},
{"id":22}
]
}
これにより、前回の更新と同じ変更が行われ、オブジェクト グラフは変更されません。ただし、「ID」のみを更新できることは、API コンシューマには明確になりません。
このシナリオでは、どのアプローチが推奨されますか?