设计数据驱动的JSON API

时间:2013-05-10 07:36:05

标签: json web-services api rest

我目前正在研究一种API,它接受大量数据并对数据执行一些不同类型的分析。不是强迫客户端为他们希望执行的每种分析传递一次数据,我认为只提供一个API调用并让该调用接受数据和操作列表(即分析类型)是有意义的。去表演。 (这意味着我的API不是RESTful,对吧?)我会以这种方式失去一些功能清晰度,但处理时间的增加很容易弥补这一点。

我的问题是如何使用JSON格式化请求。如果客户端只需要POST一组数据元素和一系列要执行的操作,那么格式化将很容易。不幸的是,一些分析类型具有需要设置的选项。我看到了一些前进的方法。

  1. 单独的操作和选项:

    {
        'data': [{'id': 1, 'content': 'blah'}, {'id': 2, 'content': 'blah}],
        'actions': ['analysis_a', 'analysis_b', 'analysis_c'],
        'options': {'option_c': 'blah'}
    }
    

    此处需要注意的是,只有在option_c启用时才需要设置analysis_c

  2. 单独的操作和选项,其中的选项与操作明确相关:

    {
        'data': [{'id': 1, 'content': 'blah'}, {'id': 2, 'content': 'blah}],
        'actions': ['analysis_a', 'analysis_b', 'analysis_c'],
        'options': {'analysis_c': {'option_c': 'blah'}}
    }
    
  3. 单个操作/选项,项目同时充当列表和字典:

    {
        'data': [{'id': 1, 'content': 'blah'}, {'id': 2, 'content': 'blah}],
        'actions': {'analysis_a': {}, 'analysis_b': {}, 'analysis_c': {'option_c': 'blah'}}
    }
    
  4. 单一操作/选项项目,数据结构清晰度更高:

    {
        'data': [{'id': 1, 'content': 'blah'}, {'id': 2, 'content': 'blah}],
        'actions': [
            {'action': 'analysis_a'}, {'action': 'analysis_b'}, {'action': 'analysis_c', 'options': {'option_c': 'blah'}}
        ]
    }
    
  5. 选项#1可能是我最不喜欢的,但在不久的将来,我们的一些分析类型将要求设置相同的选项(必须具有相同的值),并且这种情况使用Option更容易处理#1。

    我很伤心,所以任何想法或建议都会非常感激。谢谢!

1 个答案:

答案 0 :(得分:1)

我感谢选项#3和选项#4,因为每个动作都是自包含的,这提供了更多的清晰度。

选择选项#3还是选项#4取决于您将如何执行操作,如果服务器有某些操作将按名称从操作列表中检索特定操作。选项#3可能更好(因为选项#4要求你迭代数组),如果没有,我认为选项#4更好。