REST,交叉引用和性能,哪些妥协?

时间:2014-07-17 12:57:45

标签: rest cross-reference

在阅读了关于REST响应中嵌套结构的优秀线程REST Complex/Composite/Nested Resources之后,我仍然有一个问题。对于响应的表现,最佳选择是什么?

让我们举个例子。

我有一个Category对象,其中包含一些Questions。那些Questions包含一些Answers。所有这些结构都有元信息。

现在,在查询像GET http://<base_url>/categories/这样的网址时,我是否应该只包含类别的说明,请包含问题说明?哪一个,完整描述或简化?

换句话说,这些之间的最佳解决方案是什么:

{
    "results":[
        {
          'id':1,
          'name':'category1',
          'description':'foobar',
          'questions':[
                   {
                       'id':1234,
                       'question':'My question',
                       'author' : 4235345,
                       'answers':[
                              {
                                  'id':56786,
                                  'user':456,
                                  'votes':6,
                                  'answer':'It's an answer !'
                               },
                               {
                                  'id':3486,
                                  'user':4564,
                                  'votes':2,
                                  'answer':'It's another answer !'
                               },
                           ]
                   },
                   ...
               ]
           }
           ...
      ]
}

或解决方案2:

{
    "results":[
        {
          'id':1,
          'name':'category1',
          'description':'foobar',
          'questions':[
                   {
                       'id':1234,
                       'url':'http://foobar/questions/1234'
                       'answers':[
                              {
                                  'id':56786,
                                  'url':'http://foobar/answers/56786'
                               },
                               {
                                  'id':3486,
                                  'url':'http://foobar/answers/3486'
                               },
                           ]
                   },
                   ...
               ]
           }
           ...
      ]
}

OR SOLUTION 3:

{
    "results":[
        {
          'id':1,
          'name':'category1',
          'description':'foobar',
          'questions':'http://foobar/categories/1/questions'
        }
        ...
     ]
}

或许是另一种解决方案?

谢谢!

1 个答案:

答案 0 :(得分:1)

这取决于应用程序将对数据执行的操作。如果它只显示一个类别列表,那么一次传输它所需的所有数据是非常低效的,特别是如果类别很多,这将减少用户的响应时间(绝对不是否)。

这些情况严重依赖于数据的应用和使用。

我们可以做的一个优化是,我们可以创建两个请求,

GET http://<base_url>/categories

将立即返回最小数据和另一个请求,

GET http://<base_url>/categories?all=true

将返回所有数据。

然后客户端应用程序可以进行一些巧妙的优化,例如,当用户请求类别时,请求一个发送并且它将立即呈现数据。然后在获取类别列表后,用户将闲置一段时间,我们可以利用此机会使用请求2请求所有数据。

但是,正如我所说,这在很大程度上取决于应用程序。