REST API设计:在PUT调用期间更改资源标识符是否可以?

Gre*_*reg 7 api rest web-services

我很想知道围绕PUT调用的RESTful设计模式的更多信息.具体来说,我是否通过将资源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
Run Code Online (Sandbox Code Playgroud)

如果eventid表示内部资源(如数据库记录),则GET和PUT的端点可以快速访问资源.如果PUT导致服务器移动底层资源,则ID可以更改.

我这样做时违反了规范吗?

Chr*_*e L 6

REST不是一个严格的规范,而是更多的一套准则和最佳实践,可以用来构建易于理解和使用的Web服务.因此没有什么可以阻止您在PUT期间更改资源ID.

话虽这么说,这样做是IMO的一个坏习惯.REST背后的一个想法是可以使用URI引用每个资源.在您的情况下,此URI是路径和(我假设)内部ID的串联.该URI可以被其他"系统"使用并存储为引用.如果更改PUT上资源的ID,则更改URI,并且将破坏对该资源的所有引用(404).

如果您觉得需要更改属于URI的ID,则可能没有为其选择正确的属性.考虑一些不可变的其他东西(例如:使用UUID标记您的资源并使用它而不是内部数据库ID).