如果你有一个作文,如何正确设计REST?我有一个TestResult
实体,它有TestCaseResults
个实体。两者都支持全套REST方法。关于这一点的重要事实(我认为与我在网络上发现的许多示例不同)是TestResult
如果没有全部TestCaseResults
则不一致如何在REST中正确设计它?
假设我将其创建为独立但依赖的资源:api\testresults\
和api\testresults\1\testcaseresults
。当客户想要创建测试结果时,他需要POST
到api\testresults
,然后通过响应中的链接检索网址api\testresults\1\testcaseresutls
,并POST
所有测试用例结果呢。这意味着在某个时间点,测试结果在用户完成其操作之前不一致。基本上,这里没有交易的概念。
假设我只创建了api\testresults
资源,并在其中嵌入了一系列测试用例结果,如下所示:
{ "Name": "Test A" "Results": [ { "Measured": "BB", ... }, ... ] ... }
然后插入更容易,但仍然难以使用。简单GET
到api\testresults\1\
将检索大量测试用例结果的测试结果。 GET
到api\testresults\
会检索到更多内容!这种结构变得复杂。此外,在真实的单词中,我有一些实体,如TestCaseResults
属于TestResults
,因此会有一些数组,每个数组可能有100-200个元素。
api\testresults\1\testcaseresults
的链接并支持那里的操作。也许在GET api\testresults\1\
我可以提供TestResult
而不是TestCaseResults
,但只有指向资源的链接,但在POST
我可以接受TestCaseResults
的数组嵌入式(不确定它是否允许在REST中为POST
和GET
提供不同的返回类型)但是现在有两种插入信息的方法,它很混乱,我仍然不确定它是否解决任何东西。 答案 0 :(得分:1)
您使用api\testresults\1
和api\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。