如何设计简单的CRUD REST API

时间:2013-05-08 10:59:44

标签: java api rest grails

我正在设计一个简单的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)

中使用

2 个答案:

答案 0 :(得分:5)

HTTP specification为POST定义了以下内容:

  

如果在源服务器上创建了资源,则响应应该是201(已创建)并包含一个描述请求状态的实体,并引用新资源和Location头(请参阅第14.30节)。

所以这实际上意味着:

  • 您应该将201 Created作为状态代码
  • 返回
  • 您应返回Location标头,指向新创建的资源的URI
  • 您可以选择在POST响应正文中包含资源的表示,以使客户端不必针对从GET标头获取的值发出另一个Location请求。

答案 1 :(得分:1)

POST应该返回重定向到单个项目的新网址。

您可能想要删除网址的版本标识符。

而是以一种优雅地处理各种版本的方式设计您的表示和客户端。例如,客户端不应该依赖于特定的格式,而只能依赖于它实际需要的属性。

您的描述中缺少的是HATEOAS原则,即客户端不应对任何URL进行硬编码,而是在其他实体的表示内找到进一步操作的URL。由于您没有显示URL返回的结果的示例文档,因此我们无法判断您是否以良好的方式执行此操作。

查看this presentation,它解释了主题,并且还提到了一些有助于实现它的Spring库。