Java 如何设计一个简单的CRUDRESTAPI

Java 如何设计一个简单的CRUDRESTAPI,java,api,rest,grails,Java,Api,Rest,Grails,我正在设计一个简单的CRUDRESTAPI。这是我第一次,所以我想得到一些关于我的设计是否合理的反馈 我正在使用HTTP方法:GET、POST、DELETE和UPDATE。API将使用和获取JSON格式的数据。示例URL如下所示: GET (list): curl http://<domain>/myapp/rest/v1/colors POST: curl -XPOST http://<domain>/myapp/rest/v1/colors -d '{

我正在设计一个简单的CRUDRESTAPI。这是我第一次,所以我想得到一些关于我的设计是否合理的反馈

我正在使用HTTP方法:GET、POST、DELETE和UPDATE。API将使用和获取JSON格式的数据。示例URL如下所示:

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...
GET(list):curlhttp:///myapp/rest/v1/colors
帖子:curl-XPOSThttp:///myapp/rest/v1/colors -d'{
“名称”:“红色”,
“阴影”:“光”
}'
获取(单个项目):卷曲http:///myapp/rest/v1/colors/2
删除:curl-XDELETEhttp:///myapp/rest/v1/colors/2
等
问题


POST请求完成后,将在数据库中创建一条记录。那么,POST请求是否应该返回新创建记录的ID?因此,该ID可用于更新、删除和获取(单个项目)?

文章应返回单个项目的新url重定向

您可能希望释放URL的版本标识符

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

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

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

为POST定义了以下内容:

如果已在源服务器上创建资源,则响应应为201(已创建),并包含一个描述请求状态并引用新资源的实体,以及一个位置标头(参见第14.30节)

因此,这基本上意味着:

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

这取决于您如何设计rest服务。是的,发帖请求可以收到回复正文。谢谢,是的,我知道发帖可以收到正文。但是,我是否可以在处理请求后发送响应,比如说,新创建的记录的ID为
659
是的,如果这些ID与数据库同步,您可以使用这些ID。务实的回答是:是的,返回新创建项的ID(自动递增主键?)。这是否与REST一致,因此HTTP标准的规定是有争议的。谢谢,我不知道HATEOAS原则。顺便说一句,尽管缺少标记,我还是在使用grails来实现这一点。我将添加标签。因此,帖子应该返回单个项目的完整URL,而不是只返回ID,即'http:///myapp/rest/v1/colors/2“很好。因此,第三个项目符号意味着我可以简单地返回新创建的IDNo。首先,URI是ID(因此是名称)。其次,我写了“资源的表示”,这意味着如果您遵循
Location
标题中的链接,它本质上与您得到的相同,即:您最初在案例中发送的JSON。