“的RESTJSON API结构;“混合袋”;
因此,我正在构建一个基于RESTful JSON的API,其中一个结果是用户所做事情的“活动提要”(想想:Facebook新闻提要) API的示例用例: 给定用户ID,返回最近的N个活动 活动的位置:回答问题、喜欢帖子、写评论等。每个活动都有不同的相关信息 在JSON响应中如何构造它?API的客户端既是JavaScript/SPA应用程序,也是移动应用程序(iOS、android等) 我几乎没有想到什么主意 每种类型的活动都有一个不同的子模型,每个子模型上都有一个“order”属性,以便客户知道在提要中显示项目的顺序 例如-获取3项最新活动:“的RESTJSON API结构;“混合袋”;,json,api,rest,Json,Api,Rest,因此,我正在构建一个基于RESTful JSON的API,其中一个结果是用户所做事情的“活动提要”(想想:Facebook新闻提要) API的示例用例: 给定用户ID,返回最近的N个活动 活动的位置:回答问题、喜欢帖子、写评论等。每个活动都有不同的相关信息 在JSON响应中如何构造它?API的客户端既是JavaScript/SPA应用程序,也是移动应用程序(iOS、android等) 我几乎没有想到什么主意 每种类型的活动都有一个不同的子模型,每个子模型上都有一个“order”属性,以便客户知道
{
"answers": [
{
"createdOn": "2013-09-09T23:24:46.303",
"order": 1,
"question": {
"title": "Loren Ipsum"
},
"answer": "blah blah"
},
{
"createdOn": "2013-09-09T23:24:46.303",
"order": 3,
"question": {
"title": "Loren Ipsum 2"
},
"answer": "blah blah 2"
}
],
"favourites": [
{
"createdOn": "2013-09-09T23:24:46.303",
"order": 2,
"favourite": {
"id": 1
}
},
]
"totalItems": 30
}
然后,客户机将拉出订单
属性,以知道首先显示哪个活动
具有“类型”属性的混合结果包
{
"items": [
{
"type": "answer",
"createdOn": "2013-09-09T23:24:46.303",
"question": {
"title": "Loren Ipsum"
},
"answer": "blah blah"
},
{
"type": "favourite",
"createdOn": "2013-09-09T23:24:46.303",
"favourite": {
"id": 1
}
},
{
"type": "answer",
"createdOn": "2013-09-09T23:24:46.303",
"question": {
"title": "Loren Ipsum 2"
},
"answer": "blah blah 2"
}
]
"totalItems": 30
}
{
"items": [
{
"type": "answer",
"id": 332423
},
{
"type": "favourite",
"id": 552342
},
{
"type": "answer",
"id": 75544
}
]
"totalItems": 30
}
让主响应具有类型/id,然后为每个活动分离端点
{
"items": [
{
"type": "answer",
"createdOn": "2013-09-09T23:24:46.303",
"question": {
"title": "Loren Ipsum"
},
"answer": "blah blah"
},
{
"type": "favourite",
"createdOn": "2013-09-09T23:24:46.303",
"favourite": {
"id": 1
}
},
{
"type": "answer",
"createdOn": "2013-09-09T23:24:46.303",
"question": {
"title": "Loren Ipsum 2"
},
"answer": "blah blah 2"
}
]
"totalItems": 30
}
{
"items": [
{
"type": "answer",
"id": 332423
},
{
"type": "favourite",
"id": 552342
},
{
"type": "answer",
"id": 75544
}
]
"totalItems": 30
}
(…然后activities/answer/{id}
获取答案,例如)
我可以在这里得到一些建议/指导吗?有人知道Facebook是如何做到的吗?考虑支持此端点:
GET /activities?mostRecent=25&details=Yes
// or details=No, or True/False
如果客户机请求详细信息,则根据上面的选项(2),他们将获得完整的活动对象。如果客户不要求提供详细信息,则响应为最新活动的列表:
{
"items": [
{
"type": "answer",
"self": "/answers/332423"
},
{
"type": "favourite",
"self": "/favourites/552342"
}
]
"totalItems": 2
}
如果所有的活动都是同一类型的,那么最好让查询参数精确地指定具体的细节,但是如果返回多个类型,这会变得非常混乱。details=Yes/No
是一个直截了当的工具,但我认为这是您最好的选择。我建议将“否”设置为默认值以最小化网络流量,否则客户端可能会获取他们真正不关心的数据
最好包含URI,而不仅仅是ID。这可以让您的服务器稍后移动/更改URI,而不会破坏客户端。并不是说这样做是可取的,但是如果必须这样做,客户端仍然可以工作。考虑支持此端点:
GET /activities?mostRecent=25&details=Yes
// or details=No, or True/False
如果客户机请求详细信息,则根据上面的选项(2),他们将获得完整的活动对象。如果客户不要求提供详细信息,则响应为最新活动的列表:
{
"items": [
{
"type": "answer",
"self": "/answers/332423"
},
{
"type": "favourite",
"self": "/favourites/552342"
}
]
"totalItems": 2
}
如果所有的活动都是同一类型的,那么最好让查询参数精确地指定具体的细节,但是如果返回多个类型,这会变得非常混乱。details=Yes/No
是一个直截了当的工具,但我认为这是您最好的选择。我建议将“否”设置为默认值以最小化网络流量,否则客户端可能会获取他们真正不关心的数据
最好包含URI,而不仅仅是ID。这可以让您的服务器稍后移动/更改URI,而不会破坏客户端。并不是说这样做是可取的,但是如果你必须这样做,客户仍然可以工作。谢谢你的回答!我个人的偏好一直是偏离“查询/输入形成响应”方法。主要是因为客户都是内部的(网站、移动应用),而且消费在所有平台上都是一致的。换句话说,我没有看到一个客户端执行
details=yes
,另一个客户端执行details=no
。第二,我不喜欢对输入形成的单一资源做出不同反应的想法。第三,它显然增加了API的复杂性。可能会坚持我的第一步谢谢你的回答!我个人的偏好一直是偏离“查询/输入形成响应”方法。主要是因为客户都是内部的(网站、移动应用),而且消费在所有平台上都是一致的。换句话说,我没有看到一个客户端执行details=yes
,另一个客户端执行details=no
。第二,我不喜欢对输入形成的单一资源做出不同反应的想法。第三,它显然增加了API的复杂性。可能会坚持我的第一种方法