对象图更新的restapi设计

对象图更新的restapi设计,api,rest,object-graph,Api,Rest,Object Graph,我正在设计一个RESTAPI,并寻找更新对象图的推荐最佳实践。我的问题在一个示例中得到了最好的解释,因此假设我有一个GET资源,如下所示: { "name":"Bob", "country":{"id":100}, "likes":[ {"id":3}, {"id":10}, {"id":22} ] } URI:/people/123 此URI返回如下所示的对象图: { "name":"Johnny",

我正在设计一个RESTAPI,并寻找更新对象图的推荐最佳实践。我的问题在一个示例中得到了最好的解释,因此假设我有一个GET资源,如下所示:

{
    "name":"Bob",
    "country":{"id":100},
    "likes":[
        {"id":3},
        {"id":10},
        {"id":22}
    ]
}
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”,因为消费者只能更改与其他对象的关系,而不能创建新对象

以下是请求更新的一种方法:

{
    "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"}
    ]
}
这种设计明确地要求消费者只更新“Person”的“id”,但我担心PUT/PATCH的对象图与GET的对象图不同,这使得API很难学习和记忆。因此,另一个选项是请求PUT/PATCH,如下所示:

{
    "name":"Bob",
    "country":{"id":100},
    "likes":[
        {"id":3},
        {"id":10},
        {"id":22}
    ]
}
这将产生与上一次更新相同的更改,并且不会改变对象图。但是,它没有向API使用者明确说明只有“ID”可以更新


在这种情况下,建议使用哪种方法?

在我看来,对于GET和PUT请求,您应该使用相同的结构。为什么?因为将JSON/XML数据映射到对象中是很常见的,如果JSON模式始终相同,那么大多数(如果不是全部的话)进行实际映射的软件工作得最好

因此,您的Web服务应该接受以下JSON代码:

{
    "name":"Joe",
    "country":{"id":200,"name":"United States of America"},
    "likes":[
        {"id":5,"name":"Fruit"}
    ]
}
但是,它不必考虑国家名称,可能只关注国家id