REST中的组合以及插入数据的一致性

时间:2018-03-26 11:12:19

标签: json rest

如果你有一个作文,如何正确设计REST?我有一个TestResult实体,它有TestCaseResults个实体。两者都支持全套REST方法。关于这一点的重要事实(我认为与我在网络上发现的许多示例不同)是TestResult如果没有全部TestCaseResults则不一致如何在REST中正确设计它?

  1. 假设我将其创建为独立但依赖的资源:api\testresults\api\testresults\1\testcaseresults。当客户想要创建测试结果时,他需要POSTapi\testresults,然后通过响应中的链接检索网址api\testresults\1\testcaseresutls,并POST所有测试用例结果呢。这意味着在某个时间点,测试结果在用户完成其操作之前不一致。基本上,这里没有交易的概念。

  2. 假设我只创建了api\testresults资源,并在其中嵌入了一系列测试用例结果,如下所示:

  3.     { 
          "Name": "Test A"
          "Results": [ 
             {
               "Measured": "BB",
               ...
             },
             ...
          ]
          ...
        }
    

    然后插入更容易,但仍然难以使用。简单GETapi\testresults\1\将检索大量测试用例结果的测试结果。 GETapi\testresults\会检索到更多内容!这种结构变得复杂。此外,在真实的单词中,我有一些实体,如TestCaseResults属于TestResults,因此会有一些数组,每个数组可能有100-200个元素。

    1. 我可以尝试将这些方法结合起来。嵌入数组,但也提供api\testresults\1\testcaseresults的链接并支持那里的操作。也许在GET api\testresults\1\我可以提供TestResult而不是TestCaseResults,但只有指向资源的链接,但在POST我可以接受TestCaseResults的数组嵌入式(不确定它是否允许在REST中为POSTGET提供不同的返回类型)但是现在有两种插入信息的方法,它很混乱,我仍然不确定它是否解决任何东西。

1 个答案:

答案 0 :(得分:1)

您使用api\testresults\1api\testresults\1\testcaseresults的方法似乎很有希望。 由于JSON没有固定的结构,您可以向URL添加查询参数,以控制是否插入结果。

api\testresults\1?with_results=true意味着您的调用者除了测试结果外还希望查看测试用例。 api\testresults\1\testcaseresults仍会返回测试 1 的测试用例结果。

如果您担心测试用例结果的数量太大,您可以添加分页参数,这些参数将在testcaseresults调用中重复使用。
api\testresults\1?with_results=true&per_page=10将包含唯一的10个第一结果。要获得更多信息,请使用api\testresults\1\testcaseresults?per_page=10&page=2等,因为它是专用端点。

干杯

注意:如果您希望灵活的API仍然返回JSON数据,您可以查看时尚方法GraphQL