设计REST API,更复杂的对象或更多请求?

时间:2015-05-29 11:24:09

标签: rest

我对前端GUI的REST API存在问题,我想知道哪种方法更好。这些类型的问题是否有任何设计模式?

uri: /users/list

response: [
    {   
        id: "1",
        name "Aaa",
        surname "Bbb",
        contactDetails: {
            telephone: "111-111-111"
            email: "mail@mail.pl"
        }
    },
    ...
]

OR

uri: /users/list
response: [
    {   
        id: "1",
        name "Aaa",
        surname "Bbb"
    },
    ...
]

uri: /emails/list?userIds=1,..
response: [
    {
        userId: "1",
        email: "mail@mail.pl"
    }
]

uri: /telephones/list?userIds=1,..
response: [
    {
        userId: "1",
        telephone: "111-111-111"
    }
]

对于单个用户来说也是如此:

uri : users/{id}
uri : users/{id}/emails
uri : users/{id}/telephones

==============扩展班级模型============================== === 下面我粘贴为问题需求而设计的JSON类。

SystemPart : {
    id   : "sp2",
    name : "UserAdministration",
    parentSystemPart : {
        id : "sp1",
        name : "Administration",
        ...
    }
    ...
}

SystemPermission : {
    permissionType : "MODERATOR",
    systemParts    : [ // list of SystemPart
        {
            id   : "sp1",
            name : "UserAdministration",
            parentSystemPart:{...}
        },
        ...
    ],
    ...
}

User: {
    id  : "u1",
    name    : "a",
    surname : "b",
    contactDetails : {
        telephone : "111-111-111"
        email     : "mail@mail.com"
    },
    identityCard : {
        idType : "Id",
        number : "321"
    }
    systemPermissions : [ // list of SystemPermission
        {
            permissionType  : "MODERATOR",
            systemParts : [...]
        },
        ...
    ]
}

MapPoint : {
    id : "mp1",
    x : 11.11,
    y : 22.22,
    createdBy : { // User
        id : "u1",
        ...
        systemPermission : [...]
    }
}

GUI客户端希望仅使用其作者姓名和姓氏来显示地图点数据 现在是api的MapPoints列表

/map-points/list?x=11.00&y=22.00&d=5.0

GUI的其他部分希望获得具有其权限的用户列表

/users/list?page=0&size=5

在我看来,问题出现在地图点列表api中,JSON是大的

1 个答案:

答案 0 :(得分:1)

我选择第一个方法。 User课程非常小,而且我没有看到为联系方式单独拨打服务有什么好处。

确保客户端可以根据每个参数过滤结果,这样API的用户就可以轻松获得他/她想要的内容。

例如如果列表中的用户数量相对较少,/users/list会收回所有完美的内容,并且急切地缓存所有这些都可以提高客户的效果

uri: /users/list

response: [
{   
    id: "1",
    name "Aaa",
    surname "Bbb",
    contactDetails: {
        telephone: "111-111-111"
        email: "mail@mail.pl"
    }
},
...
]

如果用户数量非常大,请确保可以根据每个(或至少是重要的名称)参数将列表过滤到少量,并且客户端可以为特定用户调用您的服务,并在需要时懒洋洋地加载它们。

uri: /users/list?surname=Bbb

uri: /users/list?id=1

应该回来:

response: [
{   
    id: "1",
    name "Aaa",
    surname "Bbb",
    contactDetails: {
        telephone: "111-111-111"
        email: "mail@mail.pl"
    }
}
]