Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的RESTJSON API结构;“混合袋”;_Json_Api_Rest - Fatal编程技术网

“的RESTJSON API结构;“混合袋”;

“的RESTJSON API结构;“混合袋”;,json,api,rest,Json,Api,Rest,因此,我正在构建一个基于RESTful JSON的API,其中一个结果是用户所做事情的“活动提要”(想想:Facebook新闻提要) API的示例用例: 给定用户ID,返回最近的N个活动 活动的位置:回答问题、喜欢帖子、写评论等。每个活动都有不同的相关信息 在JSON响应中如何构造它?API的客户端既是JavaScript/SPA应用程序,也是移动应用程序(iOS、android等) 我几乎没有想到什么主意 每种类型的活动都有一个不同的子模型,每个子模型上都有一个“order”属性,以便客户知道

因此,我正在构建一个基于RESTful JSON的API,其中一个结果是用户所做事情的“活动提要”(想想:Facebook新闻提要)

API的示例用例:

给定用户ID,返回最近的N个活动

活动的位置:回答问题、喜欢帖子、写评论等。每个活动都有不同的相关信息

在JSON响应中如何构造它?API的客户端既是JavaScript/SPA应用程序,也是移动应用程序(iOS、android等)

我几乎没有想到什么主意

每种类型的活动都有一个不同的子模型,每个子模型上都有一个“order”属性,以便客户知道在提要中显示项目的顺序

例如-获取3项最新活动:

{
  "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的复杂性。可能会坚持我的第一种方法