我正在设计一个简单的CRUD REST API。这是我的第一次,所以我想得到一些关于我的设计是否有意义的反馈。
我正在使用HTTP方法:GET,POST,DELETE和UPDATE。 API将以JSON格式使用和获取数据。示例网址将如下所示:
GET (list): curl http://<domain>/myapp/rest/v1/colors
POST: curl -XPOST http://<domain>/myapp/rest/v1/colors -d '{
"name": "red",
"shade": "light"
}'
GET (single item): curl http://<domain>/myapp/rest/v1/colors/2
DELETE: curl -XDELETE http://<domain>/myapp/rest/v1/colors/2
etc...
问题
在POST请求之后,将在数据库中创建一条记录。那么,POST请求是否应该返回新创建的记录的ID?那么ID可以在UPDATE, DELETE and GET (single item)
?
答案 0 :(得分:5)
HTTP specification为POST定义了以下内容:
如果在源服务器上创建了资源,则响应应该是201(已创建)并包含一个描述请求状态的实体,并引用新资源和Location头(请参阅第14.30节)。
所以这实际上意味着:
201 Created
作为状态代码Location
标头,指向新创建的资源的URI GET
标头获取的值发出另一个Location
请求。答案 1 :(得分:1)
POST应该返回重定向到单个项目的新网址。
您可能想要删除网址的版本标识符。
而是以一种优雅地处理各种版本的方式设计您的表示和客户端。例如,客户端不应该依赖于特定的格式,而只能依赖于它实际需要的属性。
您的描述中缺少的是HATEOAS原则,即客户端不应对任何URL进行硬编码,而是在其他实体的表示内找到进一步操作的URL。由于您没有显示URL返回的结果的示例文档,因此我们无法判断您是否以良好的方式执行此操作。
查看this presentation,它解释了主题,并且还提到了一些有助于实现它的Spring库。