将当前用户上下文数据放在哪里作为响应 JSON?
Where to put current user context data in response JSON?
考虑一个社交网络。它有 posts。对于提要,您请求 /feed
并获得 post 的列表。
在 UI 中,post 会显示一些内容,例如用户是否喜欢 post,用户是否已加注星标等。这些东西看起来不属于 post 对象。
另一种情况是当你获取喜欢的时候。前端需要知道每个 'like' 对象中的用户是否被关注。
将此信息放在响应中的什么位置 JSON?
您有两个选择:
创建一个单独的 API 方法来获取有关用户上下文数据的信息 - /api/users/1/feeds/1
。请注意,此选项将强制您为每个供稿发送请求。因此,如果您有 1000 个提要 - 您将有 1000 + 1 个请求(所谓的 N+1 问题)。
至于我 - 这不是个好主意。
可以在json中存储用户数据,例如是这样的:
{
"feedName": "feed1",
...
"currentUser": {
"liked": true,
"starred": true
}
}
通过使用此选项,您将避免 RESTful 服务中的 N+1 请求问题
For all the users, the post resource should be the same. Adding specific user context info inside it seems like polluting it
我知道你来自哪里,我非常同意。
Ivan 的第一个解决方案不应该像他已经提到的那样使用,他的第二个解决方案更好但是如果你 GET posts JSON 应该只包含 post 个对象,那么也是这个 currentUser 并不真正属于那里。
我的建议是,对于每个 post,您要跟踪哪些用户喜欢 and/or 加注星标,等等。这样您就可以保持结构清晰,同时仍然可以在相同 request/response.
例子
GET /feed HTTP/1.1
[
{
"text": "hello world, im a post!",
"author": "Jack",
"likes": 3,
"likedBy": [
"John",
"James",
"Jessica"
],
"stars": 2,
"starredBy": [
"John",
"Mary"
]
},
{
"text": "hello world, im also a post! :D",
"author": "Mary",
"likes": 1,
"likedBy": [
"James"
],
"stars": 0,
"starredBy": [
]
},
]
其中每个 {}
对象代表一个 post 对象。
在客户端,您可以检查 likedBy
列表是否包含当前登录的用户,然后根据您认为合适的结果继续操作。对于星星和 post 可能具有的任何其他这些属性也是如此。
这取决于您的应用程序以及您要向用户显示的数据。例如,假设您正在列出用户的提要。在该供稿中,您想显示
- 留言
- 当前用户是否点赞(不知道点赞和关注的区别)
- 点赞数
- 喜欢的用户列表。
- 是否被用户分享
- 分享次数
- 共享用户列表。
等等
在上面的列表中,
有些数据需要两次 api 提取才能获得完整信息,有些则不需要。例如,"List of liked users"、"List of Shared users"。这通常是一个动态数据模块。您必须在单独的 api 中获取这些详细信息,以获得更好的服务器性能和数据完整性。
在某些情况下,某些应用程序需要在列表页面中先睹为快的共享用户信息。在这种情况下,您可以在同一个列表 /feeds
响应本身中包含一些固定的少量用户详细信息,并在 UI 中包含 "See More(like Facebook)" 选项。
一些静态单数数据(单列数据)可以在初始get中列出/feeds
本身。
我想知道你为什么不遵循相同的推特列表推文风格,
https://dev.twitter.com/rest/reference/get/search/tweets
{
"coordinates": null,
"favorited": false,
"truncated": false,
"created_at": "Fri Sep 21 23:40:54 +0000 2012",
"id_str": "249292149810667520",
"entities": {
"urls": [
],
"hashtags": [
{
"text": "FreeBandNames",
"indices": [
20,
34
]
}
],
"user_mentions": [
]
},
"in_reply_to_user_id_str": null,
"contributors": null,
"text": "Thee Namaste Nerdz. #FreeBandNames",
"metadata": {
"iso_language_code": "pl",
"result_type": "recent"
},
"retweet_count": 0,
"in_reply_to_status_id_str": null,
"id": 249292149810667520,
"geo": null,
"retweeted": false,
"in_reply_to_user_id": null,
"place": null,
"user":
{
"profile_sidebar_fill_color": "DDFFCC",
"profile_sidebar_border_color": "BDDCAD",
"profile_background_tile": true,
"name": "Chaz Martenstein",
"profile_image_url": "http://a0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg",
"created_at": "Tue Apr 07 19:05:07 +0000 2009",
"location": "Durham, NC",
"follow_request_sent": null,
"profile_link_color": "0084B4",
"is_translator": false,
"id_str": "29516238",
"entities": {
"url": {
"urls": [
{
"expanded_url": null,
"url": "http://bullcityrecords.com/wnng/",
"indices": [
0,
32
]
}
]
},
"description": {
"urls": [
]
}
},
"default_profile": false,
"contributors_enabled": false,
"favourites_count": 8,
"url": "http://bullcityrecords.com/wnng/",
"profile_image_url_https": "https://si0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg",
"utc_offset": -18000,
"id": 29516238,
"profile_use_background_image": true,
"listed_count": 118,
"profile_text_color": "333333",
"lang": "en",
"followers_count": 2052,
"protected": false,
"notifications": null,
"profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/9423277/background_tile.bmp",
"profile_background_color": "9AE4E8",
"verified": false,
"geo_enabled": false,
"time_zone": "Eastern Time (US & Canada)",
"description": "You will come to Durham, North Carolina. I will sell you some records then, here in Durham, North Carolina. Fun will happen.",
"default_profile_image": false,
"profile_background_image_url": "http://a0.twimg.com/profile_background_images/9423277/background_tile.bmp",
"statuses_count": 7579,
"friends_count": 348,
"following": null,
"show_all_inline_media": true,
"screen_name": "bullcityrecords"
},
"in_reply_to_screen_name": null,
"source": "web",
"in_reply_to_status_id": null
}
考虑一个社交网络。它有 posts。对于提要,您请求 /feed
并获得 post 的列表。
在 UI 中,post 会显示一些内容,例如用户是否喜欢 post,用户是否已加注星标等。这些东西看起来不属于 post 对象。
另一种情况是当你获取喜欢的时候。前端需要知道每个 'like' 对象中的用户是否被关注。
将此信息放在响应中的什么位置 JSON?
您有两个选择:
创建一个单独的 API 方法来获取有关用户上下文数据的信息 -
/api/users/1/feeds/1
。请注意,此选项将强制您为每个供稿发送请求。因此,如果您有 1000 个提要 - 您将有 1000 + 1 个请求(所谓的 N+1 问题)。
至于我 - 这不是个好主意。可以在json中存储用户数据,例如是这样的:
{ "feedName": "feed1", ... "currentUser": { "liked": true, "starred": true } }
通过使用此选项,您将避免 RESTful 服务中的 N+1 请求问题
For all the users, the post resource should be the same. Adding specific user context info inside it seems like polluting it
我知道你来自哪里,我非常同意。
Ivan 的第一个解决方案不应该像他已经提到的那样使用,他的第二个解决方案更好但是如果你 GET posts JSON 应该只包含 post 个对象,那么也是这个 currentUser 并不真正属于那里。
我的建议是,对于每个 post,您要跟踪哪些用户喜欢 and/or 加注星标,等等。这样您就可以保持结构清晰,同时仍然可以在相同 request/response.
例子
GET /feed HTTP/1.1
[
{
"text": "hello world, im a post!",
"author": "Jack",
"likes": 3,
"likedBy": [
"John",
"James",
"Jessica"
],
"stars": 2,
"starredBy": [
"John",
"Mary"
]
},
{
"text": "hello world, im also a post! :D",
"author": "Mary",
"likes": 1,
"likedBy": [
"James"
],
"stars": 0,
"starredBy": [
]
},
]
其中每个 {}
对象代表一个 post 对象。
在客户端,您可以检查 likedBy
列表是否包含当前登录的用户,然后根据您认为合适的结果继续操作。对于星星和 post 可能具有的任何其他这些属性也是如此。
这取决于您的应用程序以及您要向用户显示的数据。例如,假设您正在列出用户的提要。在该供稿中,您想显示
- 留言
- 当前用户是否点赞(不知道点赞和关注的区别)
- 点赞数
- 喜欢的用户列表。
- 是否被用户分享
- 分享次数
- 共享用户列表。
等等
在上面的列表中,
有些数据需要两次 api 提取才能获得完整信息,有些则不需要。例如,"List of liked users"、"List of Shared users"。这通常是一个动态数据模块。您必须在单独的 api 中获取这些详细信息,以获得更好的服务器性能和数据完整性。
在某些情况下,某些应用程序需要在列表页面中先睹为快的共享用户信息。在这种情况下,您可以在同一个列表 /feeds
响应本身中包含一些固定的少量用户详细信息,并在 UI 中包含 "See More(like Facebook)" 选项。
一些静态单数数据(单列数据)可以在初始get中列出/feeds
本身。
我想知道你为什么不遵循相同的推特列表推文风格,
https://dev.twitter.com/rest/reference/get/search/tweets
{
"coordinates": null,
"favorited": false,
"truncated": false,
"created_at": "Fri Sep 21 23:40:54 +0000 2012",
"id_str": "249292149810667520",
"entities": {
"urls": [
],
"hashtags": [
{
"text": "FreeBandNames",
"indices": [
20,
34
]
}
],
"user_mentions": [
]
},
"in_reply_to_user_id_str": null,
"contributors": null,
"text": "Thee Namaste Nerdz. #FreeBandNames",
"metadata": {
"iso_language_code": "pl",
"result_type": "recent"
},
"retweet_count": 0,
"in_reply_to_status_id_str": null,
"id": 249292149810667520,
"geo": null,
"retweeted": false,
"in_reply_to_user_id": null,
"place": null,
"user":
{
"profile_sidebar_fill_color": "DDFFCC",
"profile_sidebar_border_color": "BDDCAD",
"profile_background_tile": true,
"name": "Chaz Martenstein",
"profile_image_url": "http://a0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg",
"created_at": "Tue Apr 07 19:05:07 +0000 2009",
"location": "Durham, NC",
"follow_request_sent": null,
"profile_link_color": "0084B4",
"is_translator": false,
"id_str": "29516238",
"entities": {
"url": {
"urls": [
{
"expanded_url": null,
"url": "http://bullcityrecords.com/wnng/",
"indices": [
0,
32
]
}
]
},
"description": {
"urls": [
]
}
},
"default_profile": false,
"contributors_enabled": false,
"favourites_count": 8,
"url": "http://bullcityrecords.com/wnng/",
"profile_image_url_https": "https://si0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg",
"utc_offset": -18000,
"id": 29516238,
"profile_use_background_image": true,
"listed_count": 118,
"profile_text_color": "333333",
"lang": "en",
"followers_count": 2052,
"protected": false,
"notifications": null,
"profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/9423277/background_tile.bmp",
"profile_background_color": "9AE4E8",
"verified": false,
"geo_enabled": false,
"time_zone": "Eastern Time (US & Canada)",
"description": "You will come to Durham, North Carolina. I will sell you some records then, here in Durham, North Carolina. Fun will happen.",
"default_profile_image": false,
"profile_background_image_url": "http://a0.twimg.com/profile_background_images/9423277/background_tile.bmp",
"statuses_count": 7579,
"friends_count": 348,
"following": null,
"show_all_inline_media": true,
"screen_name": "bullcityrecords"
},
"in_reply_to_screen_name": null,
"source": "web",
"in_reply_to_status_id": null
}