以RESTful方式思考,使用POST在单个调用中创建资源及其子资源是否正确?
在我的应用程序中,我有资源/notices/{notice}
和子资源/notices/{notice}/photos/{photo}
。如果没有{photo}
,则{notice}
不能存在,但{notice}
不一定是照片。通常情况下,我必须首先进行POST以创建通知,然后再进行另一个POST以添加照片。
现在,我想允许创建直接附加照片的通知,通过单个POST请求创建/notices/{notice}
和/notices/{notice}/photos/{photo}
/通知/ {notice} / photos / { photo},其中包含描述两种资源的多部分内容(通知的JSON,照片的二进制)。我想我只会为子资源返回Location标题。
基本上,我希望这可以防止Android客户端向服务器发送两个POST请求以上传带有照片的通知。
它是否正确?或者它是否违反了REST原则?我应该考虑将它们分开并提出两个不同的要求吗?或者将照片视为与通知单独的实体是错误的吗?我应该只保留/notices/{notice}
作为资源,使用PUT添加照片吗?
哪种解决方案最好?
答案 0 :(得分:2)
是的,在创建父资源的同时创建子资源没有任何问题。甚至可以使用PUT
而不是POST
来执行此操作,因为父URL下的所有内容都属于/属于您要上载的资源。
修改强>
现在我想允许创建直接附加照片的通知,通过
/notices/{notice}
个/notices/{notice}/photos/{photo}
请求创建POST
和/notices/{notice}/photos/{photo}
< / p>
我不同意这一点。我建议POST到收集资源的URL /notices
。您将通知及其照片作为单一表示(请求正文)提供。然后,后端将为通知和任何组成照片创建资源。
答案 1 :(得分:0)
虽然在许多情况下它是必不可少的,但RESTful架构风格并未正式解决多个编辑/创建问题。
当您需要报告部分集合上的故障时问题就会开始,并且当故障原因不同时问题会更加严重。
它将影响选择正确的超媒体控件,这对于客户在给定的交易/对话中找到前进方向至关重要。
所以我的建议是使用嵌套循环或POST请求而不是单独的POST来创建嵌套的资源,这样就可以更容易,更清楚地解决每个资源状态的变化。