我很好奇,想更多地了解周围的PUT调用REST风格的设计模式。 具体而言,我是通过改变资源ID作为PUT调用的一部分违反规范?
考虑以下...
POST /api/event/ { ... } - returns the resource ID (eventid) of the new event in the body
GET /api/event/eventid
PUT /api/event/eventid - returns the (possibly new) resource ID depending on request body
GET /api/event/eventid - fails if the original eventid was used in the URI
为GET和PUT端点可以快速访问资源,如果事件ID代表内部资源(如数据库记录)。 如果服务器的PUT结果移动底层的资源,ID可以改变。
我是否违反规范当我这样做?
REST是不是一个严格的规范,但更多的是一套可以遵循构建Web服务,这是很容易理解和使用工作的指导方针和最佳实践。 所以,没有什么阻止你从一个PUT期间更改资源ID。
话虽这么说,这样做是IMO一种不好的做法。 一个REST背后的想法是,每个资源可以使用引用URI 。 在您的情况下,这是URI的路径和(I假设)的内部ID的串联。 这个URI可以通过其他“系统”使用,并作为参考存储。 如果你改变一个把资源的ID,你改变URI和该资源将被打破(404)的所有引用。
如果你觉得有必要改变是URI的一部分ID,您可能没有采摘的权利属性。 考虑别的东西,这将是不变的(如:带标记您的资源UUID并使用它,而不是内部的DB ID)。
没有解决全在你的问题,但是这让我担心:
返回新事件的资源ID(事件ID)在体内
不必返回一个整数ID,然后让客户从这种构造的网址,是吗? 一个适当的REST应用应该给URL的资源,而不是IDS。
至于你的问题 - 将意味着像“创建在这个位置的新资源”。 你可以想象一个重定向和回复Location
头,但它是一个有点陌生的事情。 此外,PUT的语义决定了你的要求,这可能不是你在这种情况下想要发送整个实体。 也许这将更加贴合在这种情况下使用POST? (例如POST上/api/event/1234
我认为这是好的; PUT仍然幂等(千呼万唤不会导致其他修改)。
刚:我将确保旧ID不再被使用,并且具有API返回301个代码调用旧ID(如果其他客户有联系的资源)。
也许这修改ID应该返回一个303代码,指向新的资源位置的初始PUT,我不知道在这里。
文章来源: REST API Design : Is it ok to change the resource identifier during a PUT call?