REST API Design for Update Object Graph

Я разрабатываю 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":"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}
    ]
}

Это приведет к тому же изменению, что и предыдущее обновление, и не изменит граф объекта. Однако потребителю API не ясно, что можно обновлять только «идентификаторы».

Какой подход рекомендуется использовать в этом сценарии?

13
задан Johnny Oshika 10 April 2012 в 15:31
поделиться