以RESTful的方式思考,使用POST在一个调用中创建一个资源及其子资源是正确的吗?在我的应用程序中,我有资源/notices/{notice}和子资源/notices/{notice}/photos/{photo}。没有{notice},就不可能存在{photo},但一个{notice}并不一定有照片。通常,我需要先进行一个POST创建一个notice,然后再进行另一个POST添加照片。
现在,我想允许直接附加照片创建通知,通过启用对/notices/{notice}/photos/{photo}的单个POST请求来创建/notices/{notice}和/notices/{notice}/photos/{photo},其中包含描述两个资源的多部分内容(notice的JSON,照片的二进制)。我认为只为子资源返回Location头。
本质上,我想要这样做是为了防止Android客户端向服务器发送两个POST请求以上传带有照片的通知。这样做是否正确?还是侵犯了REST原则?我应该考虑保持它们分开并进行两个不同的请求吗?或者将照片视为与通知不同的实体是错误的吗?我应该只保留/notices/{notice}作为资源,使用PUT添加照片吗?
哪种方案最好?
现在,我想允许直接附加照片创建通知,通过启用对/notices/{notice}/photos/{photo}的单个POST请求来创建/notices/{notice}和/notices/{notice}/photos/{photo},其中包含描述两个资源的多部分内容(notice的JSON,照片的二进制)。我认为只为子资源返回Location头。
本质上,我想要这样做是为了防止Android客户端向服务器发送两个POST请求以上传带有照片的通知。这样做是否正确?还是侵犯了REST原则?我应该考虑保持它们分开并进行两个不同的请求吗?或者将照片视为与通知不同的实体是错误的吗?我应该只保留/notices/{notice}作为资源,使用PUT添加照片吗?
哪种方案最好?
POST
是唯一明智的选择,因为OP没有直接修改最顶层资源。如果使用PUT
创建资源,则意味着该子资源已经存在? - James/resource
、/resource?blob=false
和/resource/blob
以发送整个资源、没有大数据项的资源和仅数据。在这种情况下,PUT到包含所有资源的/resource也会使其他两个URI过时(条件GET/HEAD将不返回304)。 - Nicholas Shanks