13

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 コンシューマには明確になりません。

このシナリオでは、どのアプローチが推奨されますか?

4

1 に答える 1

9

私の意見では、GET リクエストと PUT リクエストの両方で同じ構造を維持する必要があります。なんで?JSON/XML データをオブジェクトにマップすることは非常に一般的であり、実際のマッピングを行うほとんどの (すべてではないにしても) ソフトウェアは、JSON スキーマが常に同じである場合に最適に機能するためです。

したがって、Web サービスは次の JSON コードを受け入れる必要があります。

{
    "name":"Joe",
    "country":{"id":200,"name":"United States of America"},
    "likes":[
        {"id":5,"name":"Fruit"}
    ]
}

ただし、国名を考慮する必要はなく、国 ID のみに焦点を当てる場合があります。

于 2012-04-10T15:50:07.523 に答える