“混合包”的REST JSON API结构

时间:2015-07-27 06:39:05

标签: json api rest

所以我正在构建一个基于RESTful JSON的API,其中一个结果是用户所做的“活动源”(想想:Facebook新闻源)。

API的示例用例:

  

根据用户的ID,返回最近的N个活动

活动可能是:回答问题,收集帖子,撰写评论等。每项活动都有不同的信息。

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

很少有想法浮现在脑海中。

为每种类型的活动设置不同的子模型,每个活动都有一个“订单”属性,以便客户知道在Feed中显示项目的顺序

例如 - 获取最近的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
}

然后,客户端将提取order属性以了解首先显示哪个活动。

带有“类型”属性的混合结果包

{  
  "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
}

主响应是否具有类型/ ID,然后为每个活动分隔端点

{  
  "items": [
    {      
      "type": "answer",
      "id": 332423
    },
    {      
      "type": "favourite",
      "id": 552342
    },
    { 
      "type": "answer",
      "id": 75544
    }   
  ]
  "totalItems": 30
}

(..然后activities/answer/{id}得到答案,例如)

我可以在这里获得一些建议/指导吗?任何人都知道Facebook如何做到这一点?

1 个答案:

答案 0 :(得分:0)

考虑支持此终端:

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而不会破坏客户端。并不是说这样做是可取的,但是这样,如果你必须对客户端仍然有效。