REST - 使用单个POST创建嵌套资源

时间:2013-01-11 09:37:14

标签: rest restful-url

以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添加照片吗?

哪种解决方案最好?

2 个答案:

答案 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来创建嵌套的资源,这样就可以更容易,更清楚地解决每个资源状态的变化。