我正在使用一个可以返回用户列表的API:
"users": [
{
"userId": 1,
"name": "John Smith"
"address": {
"countryCode": "gb",
"street": "Orford Street 20",
"locality": "London"
}
"skills": [
{ "skillId": 1, "name": "design" },
{ "skillId": 2, "name": "logotype" }
]
}
]
考虑我需要创建一个具有地址和技能的用户。
哪种正文格式更常用?某种扁平化:
"users": [
{
"name": "John Smith"
"addressCountryCode": "gb",
"addressStreet": "Orford Street 20",
"addressLocality": "London"
"skills": [ "design", "logotype" ]
}
]
也许遵循与GET响应相同的格式:
"users": [
{
"name": "John Smith"
"address": {
"countryCode": "gb",
"street": "Orford Street 20",
"locality": "London"
}
"skills": [
{ "name": "design" },
{ "name": "logotype" }
]
}
]
或者可以按以下步骤创建用户:
我相信,即使API具有step端点,但接受具有所有数据的User的API也会阻止多个Post查询创建一个用户。
哪种方法更常用?
或者甚至可以使用另一个?
答案 0 :(得分:3)
如果您要遵循Rest Design,最好为每个操作都设置一个端点,因此第3种方法是您应该使用的方法。 这种方式有一些优点:
假设您有一个现有用户,并且想为其分配地址。 如果您采用第一种或第二种方法,则现在需要创建另一个获取 UserId 和 Address 的终结点,以将其添加到用户。
但是,如果您采用了第3种方法,则已经有一个端点可以执行此操作,并且您可以在这种情况下重复使用它。
在第一种方法中,不清楚单个动作方法的作用。有一个巨大的方法可以创建用户,创建地址并将其分配给用户,创建一些技能并将其分配给用户,然后...
在第三种方法中,很明显端点可以做什么。一个端点创建一个用户,一个端点为其创建地址,一个端点为其创建技能,依此类推。 更改这些方法主体之一只有一个理由。
您在这里遵守了“单一责任原则”。
第三种方法可能会出现的一个问题是,通过这种方式,我们将有更多的API调用来创建用户并为其分配地址。至少会有2次API调用!
答案是,您可以使用批处理通过一次API调用一次调用多个端点。有一些不错的批处理请求实现,例如OData Batch,您可以利用它们。