我正在设计一个 REST API,并正在寻找更新对象图的推荐最佳实践。我的问题最好用一个例子来解释,所以假设我有一个 GET 资源,如下所示:
URI:/人/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”。
在这种情况下,推荐哪种方法?