创建与其他实体相关联的实体的正确方法是什么?我无法找到任何有关如何使用FOSRestBundle包在Symfony中完成或如何完成的来源。
让我们拥有实体Car,其中包含Wheel实体。
如何在一个请求中创建带轮子的汽车?
url: foo.com/cars POST
数据: {car:{name="porsche", wheels:[{name:"fr"}, {name:"fl"}] }}
这是怎么做的正确方法?我读了一些关于LINK和UNLINK http方法的内容,但是需要发送多个请求才能创建所有轮子,然后将它们链接在一起。
如何创建属于多辆车的车轮?
url: foo.com/wheels POST
数据: {wheel:{name="super wheel", cars:[{id:1}, {id:2}] }}
在这种情况下,可能使用LINK标头是合适的。但在阅读this文章之后,它还需要解析所有POSTS和PUTS的LINK标题,使其变得昂贵且笨重。
我写信给提到的文章的作者。这是他的答案:
我认为您可以在一个请求中发送包含您的车轮和汽车的数据。这里最重要的是要务实。没有"明确"构建REST API的规则。
当资源已经存在时,LINK / UNLINK非常有用,并且您希望"链接"它们,在>换句话说,你想要添加一个"关系"例如,他们之间,例如用户的友谊。
关于你的第二个问题,如果汽车存在,你可以,首先,创建你的车轮,"链接" >它到你的车。但这意味着有两个请求执行此操作(您可以在一个请求中添加多个链接标头),或者更好的是您可以发送一个带有链接标头的POST请求:一个请求统治它们:p
另一种选择是参考汽车' ids到你的车轮数据。我认为这样做也很好。
答案 0 :(得分:1)
我们最近也进行了同样的讨论。
为了清晰和清洁的架构,有一些东西要说,你可以从关系中分离我们的资源等等。还有一些事情可以说是没有提出1000个请求以及将属于一起的东西放在一起。
我们的最终解决方案非常像您的解决方案。另一个解决方案是在插入资源时永远不要包含资源关系,并且有一个单独的API端点来创建关系(例如POST / cars / 1 / wheels / fl)
您走哪条路主要取决于您的域逻辑和应用要求。一旦你有了循环的m:n关系,你(和我们)选择的方法就会遇到大麻烦。对于更简单和层次化的关系,这是一种非常好的方式。
答案 1 :(得分:0)
正如您所说:“构建REST API没有”明确的“规则”。
我通常使用表单来验证我的API中的数据,因此,我已经拥有了我的参数。我使用它是因为,我只需要编写一个端点(以API方式使用,也可以渲染html前端)。表单可能需要ID或子对象(或两者)。
我不是说你应该使用我的观点。但我要说的是:您的API,您的规则(由客户自行调整,但您必须将客户视为构建API)。